2012-09-19 46 views
2

可能重复:
Best way to merge two maps and sum the values of same key?使用Scala的地图累积值

我有一大堆的类型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本身就是一个monoid的时候有一个不同的。

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

+0

有很多方法可以用Scalaz做到这一点,但是真的很遗憾我们不在集合API的'Map'上有'unionWith'方法。 –

回答

7

Scalaz具有用于地图幺半群实例[A,B]如果B也幺半群。

> Map("a" -> 1, "b" -> 2) |+| Map("a" -> 3, "c" -> 5) 
    Map("a" -> 4, "c" -> 5, "b" -> 2) 
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) 
+0

我从未完全理解Multiset的术语选择。他们形成了他们的组成部分的直方图,所以为什么不叫他们直方图? –