0

在我的 dao 中,我收到一个元组 [String,String],其中 _1 是非唯一的,_2 是唯一的。我 groupBy 基于 _1 得到这个 -

val someCache : Map[String, List[(String, String)]]

这显然是浪费的,因为 _1 正在为 Map 的所有值重复。由于 _2 是独一无二的,我想要的是 -

val someCache : Map[String, Set[String]]

即按_1分组并用作键并将成对的_2用作Set [String]类型的值

4

2 回答 2

1

直接的解决方案是映射所有元素并将每个列表转换为集合:

someCache.map{ case (a, l) => a -> l.map{ _._2 }.toSet }

您也可以使用mapValues,但您应该注意,它会创建一个惰性集合并在每次访问值时执行转换。

于 2013-08-08T13:34:27.190 回答
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))
于 2013-08-08T14:17:51.057 回答