在没有循环的情况下从映射类型和数组 Scala 中查找常见字符串

Finding common strings from map type and array Scala without loops

我试图在地图和数组中找到公共字符串以输出相应的 values(来自地图,这里的值是 Map[key -> value]) 在 Scala 中,我试图不使用任何循环。示例:

输入:

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

输出:

Array(5,4) 

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

相当简单的scala优雅语法:

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)

答案在这里!

使用 .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)

或者,

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

你这里的复杂度是O(n2)

什么是循环?

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)

我认为这是最优雅的解决方案,但如果数组中有重复项,结果可能不符合您的要求。

yourArray.collect(yourMap) // Array(5,4)