从映射中检索已过滤的键集的值

时间:2015-12-06 15:46:57

标签: scala

我是Scala编程的新手,正在寻找一种方法,可以从地图中检索另一张地图中过滤的一组键的值列表。

EX- filter = [k1,k2,k3] inputMap = [k1-> 1,k1-> 2,k2-> 6,k2-> 7,k2-> 9,k3-> 5,k10-> 66,k4-> 45 ]

outputMap = [k1->(1,2),k2->(6,7,9),k3->(5)]

提前致谢! -Nancy

1 个答案:

答案 0 :(得分:2)

你输入地图的例子'看起来更像是键值对列表,因为map不能包含重复键。 所以:

val list = List("k1"->1, "k1"->2, "k2"->6, "k2"->7, "k2"->9, "k3"->5, "k10"->66, "k4"->45)
val f = Set("k1", "k2", "k3")  //filter

首先只过滤所需的键:

scala>val filtered = list.filter {case (k,v)=>f(k)}
filtered: List[(String, Int)] = List((k1,1), (k1,2), (k2,6), (k2,7), (k2,9), (k3,5))

按键分组:

scala>val grouped = filtered.groupBy(_._1)
grouped: scala.collection.immutable.Map[String,List[(String, Int)]] = Map(k2 -> List((k2,6), (k2,7), (k2,9)), k1 -> List((k1,1), (k1,2)), k3 -> List((k3,5)))

现在转换为所需的格式:

val outputMap = grouped.map {case (k,v)=>k->v.map{case (ki,vi) => vi}}
outputMap: scala.collection.immutable.Map[String,List[Int]] = Map(k2 -> List(6, 7, 9), k1 -> List(1, 2), k3 -> List(5))