假设我有一个字符串映射 - >整数列表。我想创建一个函数,它接受一个字符串List作为参数,并返回与该列表中所有字符串相关的所有整数。即如果Map X包含以下映射:
database = [("Bob",[1,2,3]),("John",[1,5,6]),("Trevor",[4,5,7])]
如果此函数将[“Bob”,“John”]作为名称列表,则应该返回,
[1,2,3,5,6]
由于Bob与1,2,3相关,而John与1,5,6相关(两个名称的相同条目不重复)。如果我不需要,我也不想引入一个可变变量,因此让我相信一个能够产生这个数值列表的理解是实现这个目标的最好方法,但我不确定如何。
答案 0 :(得分:5)
如果您想使用for-comprehension
,可以这样:
val result = for {
key <- keys
nums <- map.get(key).toSeq
num <- nums
} yield num
result.distinct
说明:
对于列表中的每个键,尝试获取一个条目并将其转换为Seq
(这是必要的,因为flatMap在这种情况下需要Seq
)并将列表中的每个数字添加到结果中。如果地图中没有该键,则该集合将为空,因此不会产生任何结果。最后,请致电distinct
以删除重复项。
答案 1 :(得分:4)
val myMap = Map("Bob" -> List(1,2,3), "John" -> List(1,5,6), "Trevor" -> List(4,5,7))
val names = List("Bob", "John")
您可以使用方法Map
将默认值添加到withDefaultValue
:
val mapWithDefaul = myMap withDefaultValue Nil
然后您可以在Map
中使用flatMap
作为函数:
names.flatMap(mapWithDefaul).distinct
// List(1, 2, 3, 5, 6)
答案 2 :(得分:2)
让
val db = Map("Bob" -> List(1,2,3), "John" -> List(1,5,6), "Trevor" -> List(4,5,7))
val names = List("Bob", "John")
然后使用flatMap
,
implicit class mapCorr[A,B](val db: Map[A,List[B]]) extends AnyVal {
def corr(keys: List[A]): List[B] = {
keys.flatMap{ k => db get k }.flatten.distinct
}
}
和
scala> db.corr(keys)
res0: List[Int] = List(1, 2, 3, 5, 6)
在这里,我们允许使用A
类型的关键列表,以及从A
类型到List[B]
类型的地图。
答案 3 :(得分:1)
val myset = Set("Bob","John")
val database = Map(("Bob"->List(1,2,3)),("John"->List(1,5,6)),("Trevor"->List(4,5,7)))
val ids = database.filter(m => myset.contains(m._1)).map(_._2).flatten.toList.distinct
输出:
ids: List[Int] = List(1, 2, 3, 5, 6)
答案 4 :(得分:1)
类似的东西:
val result = database.filter(elem => list.contains(elem._1)).foldLeft(List())((res,elem) => res ++ elem._2)
其中list是名称的输入列表。