在没有循环的情况下从映射类型和数组 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)
我试图在地图和数组中找到公共字符串以输出相应的 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)