【问题标题】:How to merge Maps in Scala with tuples as key如何在 Scala 中以元组为键合并 Maps
【发布时间】: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


【解决方案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))
      

      【讨论】:

        猜你喜欢
        • 2013-05-31
        • 2019-10-20
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        • 2022-11-12
        • 1970-01-01
        • 2016-10-08
        • 2017-08-09
        相关资源
        最近更新 更多