首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >合并两个映射并将相同键的值求和的最好方法?

合并两个映射并将相同键的值求和的最好方法?
EN

Stack Overflow用户
提问于 2011-08-16 17:29:20
回答 13查看 92.8K关注 0票数 181
代码语言:javascript
复制
val map1 = Map(1 -> 9 , 2 -> 20)
val map2 = Map(1 -> 100, 3 -> 300)

我想合并它们,并将相同键的值相加。因此,结果将是:

代码语言:javascript
复制
Map(2->20, 1->109, 3->300)

现在我有两个解决方案:

代码语言:javascript
复制
val list = map1.toList ++ map2.toList
val merged = list.groupBy ( _._1) .map { case (k,v) => k -> v.map(_._2).sum }

代码语言:javascript
复制
val merged = (map1 /: map2) { case (map, (k,v)) =>
    map + ( k -> (v + map.getOrElse(k, 0)) )
}

但我想知道有没有更好的解决方案。

EN

回答 13

Stack Overflow用户

发布于 2011-08-16 22:58:36

据我所知,只使用标准库的最简短的答案是

代码语言:javascript
复制
map1 ++ map2.map{ case (k,v) => k -> (v + map1.getOrElse(k,0)) }
票数 157
EN

Stack Overflow用户

发布于 2011-08-16 18:16:50

快速解决方案:

代码语言:javascript
复制
(map1.keySet ++ map2.keySet).map {i=> (i,map1.getOrElse(i,0) + map2.getOrElse(i,0))}.toMap
票数 49
EN

Stack Overflow用户

发布于 2016-04-27 12:25:57

只需使用普通的Scala就可以将其实现为Monoid。下面是一个示例实现。使用这种方法,我们可以合并的不只是2个,而是一个映射列表。

代码语言:javascript
复制
// Monoid trait

trait Monoid[M] {
  def zero: M
  def op(a: M, b: M): M
}

合并两个地图的Monoid特征的基于地图的实现。

代码语言:javascript
复制
val mapMonoid = new Monoid[Map[Int, Int]] {
  override def zero: Map[Int, Int] = Map()

  override def op(a: Map[Int, Int], b: Map[Int, Int]): Map[Int, Int] =
    (a.keySet ++ b.keySet) map { k => 
      (k, a.getOrElse(k, 0) + b.getOrElse(k, 0))
    } toMap
}

现在,如果您有一个需要合并的map列表(在本例中,只有2个),可以像下面这样完成。

代码语言:javascript
复制
val map1 = Map(1 -> 9 , 2 -> 20)
val map2 = Map(1 -> 100, 3 -> 300)

val maps = List(map1, map2) // The list can have more maps.

val merged = maps.foldLeft(mapMonoid.zero)(mapMonoid.op)
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7076128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档