2012-09-19 77 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的術語選擇。他們形成了他們的組成部分的直方圖,所以爲什麼不叫他們直方圖? –