Scala:如何合并 map 集合

标签 scala map folding scala-collections

我有一个 Map[String, Double] 列表,我想将它们的内容合并到一个 Map[String, Double] 中。我应该如何以惯用的方式做到这一点?我想我应该能够通过折叠来做到这一点。就像是:

val newMap = Map[String, Double]() /: listOfMaps { (accumulator, m) => ... }

此外,我想以通用的方式处理键冲突。也就是说,如果我向已经存在的 map 添加一个键,我应该能够指定一个函数,该函数返回一个 Double(在这种情况下)并采用该键的现有值,加上我尝试添加的值.如果映射中尚不存在该键,则只需添加它并保持其值不变。

在我的特定情况下,我想构建一个 Map[String, Double] 这样如果 map 已经包含一个键,那么 Double 将被添加到现有的 map 值中。

我正在我的特定代码中使用可变映射,但如果可能的话,我对更通用的解决方案感兴趣。

最佳答案

这个怎么样:

def mergeMap[A, B](ms: List[Map[A, B]])(f: (B, B) => B): Map[A, B] =
  (Map[A, B]() /: (for (m <- ms; kv <- m) yield kv)) { (a, kv) =>
    a + (if (a.contains(kv._1)) kv._1 -> f(a(kv._1), kv._2) else kv)
  }

val ms = List(Map("hello" -> 1.1, "world" -> 2.2), Map("goodbye" -> 3.3, "hello" -> 4.4))
val mm = mergeMap(ms)((v1, v2) => v1 + v2)

println(mm) // prints Map(hello -> 5.5, world -> 2.2, goodbye -> 3.3)

它适用于 2.7.5 和 2.8.0。

关于Scala:如何合并 map 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1262741/

相关文章:

string - Scala,函数的字符串表示

scala - 如何创建单独的 sbt 配置或任务以使用 WartRemover 进行编译?

scala - Play 框架 Controller 的单元测试

c++ - std::map 迭代器如何工作?

scala - 迭代器上的Scala映射不会产生副作用

java - 哪些代码折叠插件适用于 Eclipse 3.6?

python - Vim:如何在正则表达式匹配后的行上开始语法折叠? ( python 功能)

scala - 任何适用于 Scala 的 UML 工具

c++ - std::map 键的要求(设计决策)

Vim 缩进折叠依赖