【问题标题】:Using scala Maps to accumulate values [duplicate]使用scala Maps来累积值[重复]
【发布时间】:2012-09-11 20:23:48
【问题描述】:

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

【问题讨论】:

  • 使用 Scalaz 有多种方法可以做到这一点,但很遗憾,我们在 Collections API 中的 Map 上没有 unionWith 方法。

标签: scala scalaz


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    看起来您实际上是在尝试将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)
    

    【讨论】:

    • 我从来没有完全理解 Multiset 的术语选择。它们形成了其成分的直方图,那么为什么不称它们为直方图呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2012-04-19
    • 1970-01-01
    • 2019-02-04
    • 2017-03-23
    • 1970-01-01
    相关资源
    最近更新 更多