代码之家  ›  专栏  ›  技术社区  ›  Ashwin Praveen

从无循环的映射类型和数组Scala中查找公共字符串

  •  0
  • Ashwin Praveen  · 技术社区  · 7 年前

    价值

    输入:

    Array("Ash","Garcia","Mac") Map("Ash" -> 5, "Mac" -> 4, "Lucas" -> 3)
    

    Array(5,4) 
    

    输出是一个包含5和4的数组,因为Ash和Mac在这两种数据结构中都很常见

    4 回复  |  直到 7 年前
        1
  •  3
  •   jwvh    7 年前

    什么构成循环?

    def common(arr: Array[String], m: Map[String,Int]): Array[Int] =
      arr flatMap m.get
    

    common(Array("Ash","Garcia","Mac")
          ,Map("Ash" -> 5, "Mac" -> 4, "Lucas" -> 3))
    // res0: Array[Int] = Array(5, 4)
    
        2
  •  3
  •   corvus_192    7 年前

    yourArray.collect(yourMap) // Array(5,4) 
    
        3
  •  1
  •   prayagupa soxunyi    7 年前

    使用 .filter 若要仅查找匹配条目,请获取过滤映射的值。

    鉴于

    scala> val names = Array("Ash","Garcia","Mac")
    names: Array[String] = Array(Ash, Garcia, Mac)
    
    scala> val nameToNumber = Map("Ash" -> 5, "Mac" -> 4, "Lucas" -> 3)
    nameToNumber: scala.collection.immutable.Map[String,Int] = Map(Ash -> 5, Mac -> 4, Lucas -> 3)
    

    .filter.map

    scala> nameToNumber.filter(x => names.contains(x._1)).map(_._2)
    res3: scala.collection.immutable.Iterable[Int] = List(5, 4)
    

    或者, you can use collect ,

    scala> nameToNumber.collect{case kv if names.contains(kv._1) => kv._2}
    res6: scala.collection.immutable.Iterable[Int] = List(5, 4)
    

    你的复杂性在于 O(n2)

        4
  •  1
  •   ashburshui    7 年前

    val a = Array("Ash","Garcia","Mac")
    val m = Map("Ash" -> 5, "Mac" -> 4, "Lucas" -> 3)
    println(m.filter { case (k, v) => a.contains(k)}.map { case (k, v) => v}.toArray)
    

    这是解决方案