在我的dao中,我收到一个元组[String,String],其中_1是非唯一的,_2是唯一的。我groupAy基于_1得到这个 -
val someCache : Map[String, List[(String, String)]]
这显然是浪费,因为_1正在为地图的所有值重复。由于_2是唯一的,我想要的是 -
val someCache : Map[String, Set[String]]
即。按_1分组并用作键,并使用配对的_2s作为Set [String]
类型的值答案 0 :(得分:1)
直接的解决方案是映射所有元素并将每个列表转换为设置:
someCache.map{ case (a, l) => a -> l.map{ _._2 }.toSet }
您也可以使用mapValues
但是您应该注意它会创建一个惰性集合,并在每次访问值时执行转换。
答案 1 :(得分:1)
def foo(ts: Seq[(String, String)]): Map[String, Set[String]] = {
ts.foldLeft(Map[String, Set[String]]()) { (agg, t) =>
agg + (t._1 -> (agg.getOrElse(t._1, Set()) + t._2))
}
}
scala> foo(List(("1","2"),("1","3"),("2","3")))
res4: Map[String,Set[String]] = Map(1 -> Set(2, 3), 2 -> Set(3))