如何将整数列表转换为映射删除重复项?

时间:2014-02-25 08:41:34

标签: list scala for-loop

假设我有一个字符串映射 - >整数列表。我想创建一个函数,它接受一个字符串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相关(两个名称的相同条目不重复)。如果我不需要,我也不想引入一个可变变量,因此让我相信一个能够产生这个数值列表的理解是实现这个目标的最好方法,但我不确定如何。

5 个答案:

答案 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

对@ senia进行类似的处理
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是名称的输入列表。