如何在 Scala 中以元组为键合并 Maps
Posted
技术标签:
【中文标题】如何在 Scala 中以元组为键合并 Maps【英文标题】:How to merge Maps in Scala with tuples as key 【发布时间】:2017-08-20 09:24:30 【问题描述】:我有这种初始类型的地图:
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 做到这一点?
【问题讨论】:
Scala: Merge map 和许多其他的可能重复。元组作为键没有区别 【参考方案1】:你可以这样做:
(m1.toSeq ++ m2.toSeq)
.groupBy case (k, v) => k
.mapValues(_.map case (k, v) => v )
【讨论】:
【参考方案2】:如果你已经导入了scalaz
,那么你可以这样做:
m1.mapValues(_.point[List]) |+| m2.mapValues(_.point[List])
【讨论】:
【参考方案3】:您可以将 Maps 转换为 Seq,然后通过 key 对 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))
【讨论】:
以上是关于如何在 Scala 中以元组为键合并 Maps的主要内容,如果未能解决你的问题,请参考以下文章