将元组映射转换为集合映射

时间:2013-08-08 13:32:29

标签: scala group-by tuples

在我的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]

类型的值

2 个答案:

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