我找到了这个方法:
def merge[K, V](maps: Seq[Map[K, V]])(f: (K, V, V) => V): Map[K, V] = {
maps.foldLeft(Map.empty[K, V]) { case (merged, m) =>
m.foldLeft(merged) { case (acc, (k, v)) =>
acc.get(k) match {
case Some(existing) => acc.updated(k, f(k, existing, v))
case None => acc.updated(k, v)
}
}
}
}
但如果我像这样使用它,它会给我一个类型不匹配错误:
val mergeMsg = (map1: LinkedHashMap[Int, ListBuffer[Int]], map2: LinkedHashMap[Int, ListBuffer[Int]]) =>
{
val ms=Seq(map1, map2)
merge(ms.map(_.mapValues(List(_)))){(_, v1, v2) => v1 ++ v2}
}
错误说: “类型不匹配,预期:mutable.Seq [Mutable.Map [NotInferedK,NotInferedV]],actual:mutable.Seq [Map [Int,List [ListBuffer [Int]]]]”
我该如何解决这个问题?我知道这很简单,但我是斯卡拉的新手。
答案 0 :(得分:1)
问题是你传递给merge
一系列可变的LinkedHashMaps。该函数需要一系列不可变映射。
您需要先将LinkedHashMaps转换为正确的类型。最简单的方法是在执行.toMap
之前调用mapValues
。
merge(ms.map(_.toMap.mapValues(List(_)))){(_, v1, v2) => v1 ++ v2}
<强>更新强>
或者,Merge的方法签名可以更改为显式使用scala.collection.Map
。默认情况下,它会使用scala.collection.immutable.Map
。
def merge[K, V](maps: Seq[scala.collection.Map[K, V]])(f: (K, V, V) => V): scala.collection.Map[K, V]
答案 1 :(得分:0)
val mergeMsg = (map1: LinkedHashMap[Int, ListBuffer[Int]],
map2: LinkedHashMap[Int, ListBuffer[Int]]) => {
val ms = Seq (map1.toMap, map2.toMap)
merge (ms) ((_, lb1, lb2) => (lb1 ++ lb2))
}
因此Type只需要转换为Map。 k不用于更新过程,因此我们使用_代替。 lbs适用于ListBuffers。