2

可能重复:
合并两个地图并对相同键的值求和的最佳方法?

我有一堆类型的地图Map[String, Int]。我希望能够在键对应时将它们合并为值的总和。例如,++地图上的标准方法给出

Map("a" -> 1, "b" -> 2) ++ Map("a" -> 3, "c" -> 5)
// Map[String,Int] = Map(a -> 3, b -> 2, c -> 5)

我想定义一个结果会给出的操作

Map("a" -> 1, "b" -> 2) ?? Map("a" -> 3, "c" -> 5)
// Map[String,Int] = Map(a -> 4, b -> 2, c -> 5)

在花哨的措辞中,总是有一个自然的幺半群结构,但是当它本身是一个幺半群Map[A, B]时,有一个不同的结构。B

现在,为 编写一个递归实现并不难LinkedHashMap,但我认为必须有一些简单且更通用的方法来编写它,可能使用 scalaz。有任何想法吗?

4

2 回答 2

7

如果 B 也是一个幺半群,Scalaz 有一个 Map[A,B] 的幺半群实例。

> Map("a" -> 1, "b" -> 2) |+| Map("a" -> 3, "c" -> 5)
  Map("a" -> 4, "c" -> 5, "b" -> 2)
于 2012-09-21T11:19:21.723 回答
0

看起来您实际上是在尝试将 aMap用作Multiset. 对于多重集,您描述的操作只是多重集 sum s1 ⊎ s2

不幸的是,Scala Collections Framework 中没有多重集,但有一些用于 Java

Multiset对于Scala 中的假设:

Multiset("a", "b", "b") ++ Multiset("a", "a", "a", "c", "c", "c", "c", "c")
// Multiset[String] = Multiset("a" -> 4, "b" -> 2, "c" -> 5)
于 2012-09-19T14:13:54.657 回答