我有一个 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/