使用scala Maps累积值

时间:2012-09-19 13:51:09

标签: scala scalaz

  

可能重复:
  Best way to merge two maps and sum the values of same key?

我有一堆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。有什么想法吗?

2 个答案:

答案 0 :(得分:7)

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

> Map("a" -> 1, "b" -> 2) |+| Map("a" -> 3, "c" -> 5)
  Map("a" -> 4, "c" -> 5, "b" -> 2)

答案 1 :(得分:0)

看起来您实际上是在尝试将Map用作Multiset。对于多集合,您描述的操作只是多重汇总s1 ⊎ s2

不幸的是,there is no multiset in the Scala Collections Framework,但there are some for Java

对于Scala中的假设Multiset

Multiset("a", "b", "b") ++ Multiset("a", "a", "a", "c", "c", "c", "c", "c")
// Multiset[String] = Multiset("a" -> 4, "b" -> 2, "c" -> 5)