可能重复:
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。有什么想法吗?
答案 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)