如何将Scala中的地图与元组合并为

时间:2017-03-27 15:19:11

标签: scala

我有这种初始类型的地图:

m: Map[(String, String, String), Double]

我希望合并它们以获得具有以下类型的最终Map

mm:Map [(String,String,String),Seq [Double]]

例如:

val m1 = Map (("a","b","c") -> 2.0, ("a","b","d") -> 3.0)
val m2 = Map (("a","b","c") -> 5.0, ("a","b","k") -> 3.0)
// after the merge
Map (("a","b","c") -> Seq(2.0, 5.0), ("a","b","d") -> Seq(3.0), ("a","b","k") -> Seq(3.0))

如何使用Scala获得该功能?

3 个答案:

答案 0 :(得分:2)

你可以这样做:

(m1.toSeq ++ m2.toSeq)
  .groupBy { case (k, v) => k }
  .mapValues(_.map { case (k, v) => v })

答案 1 :(得分:1)

如果您已导入scalaz,则可以执行以下操作:

m1.mapValues(_.point[List]) |+| m2.mapValues(_.point[List])

答案 2 :(得分:0)

您可以将地图转换为Seq,然后按键对Seq进行分组:

(m1.toSeq ++ m2.toSeq).groupBy(_._1).mapValues(_.map(_._2))
// res80: scala.collection.immutable.Map[(String, String, String),Seq[Double]] = Map((a,b,k) -> ArrayBuffer(3.0), (a,b,c) -> ArrayBuffer(2.0, 5.0), (a,b,d) -> ArrayBuffer(3.0))