如何在Scala中合并两个LinkedHashMaps[Int,ListBuffer[Int]]?

如何在Scala中合并两个LinkedHashMaps[Int,ListBuffer[Int]]?,scala,list,dictionary,linkedhashmap,Scala,List,Dictionary,Linkedhashmap,我发现这个方法: 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

我发现这个方法:

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]],实际为:mutable.Seq[Map[Int,List[ListBuffer[Int]]]


我怎样才能解决这个问题?我知道这很简单,但我对scala还不熟悉。

问题是,您正在向
merge
传递一系列可变的LinkedHashMaps。该函数需要一系列不可变的映射

您需要先将LinkedHashMaps转换为正确的类型。最简单的方法可能是在执行
mapValues
之前调用
.toMap

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]
因此,只需将类型转换为Map。 k不用于更新过程,因此我们使用u。
lbs用于列表缓冲区

LinkedHashMap
扩展了
scala.collection.mutable.Map
它扩展了
scala.collection.Map
,不是吗?没错,但我相信您的方法签名
…Seq[Map[K,V]]…
将默认使用
scala.collection.immutable.Map
(除非您专门导入了
scala.collection.Map
)。您可以使用类似
def merge[K,V](映射:Seq[scala.collection.Map[K,V]])(f:(K,V,V)=>V):scala.collection.Map[K,V]
-这应该意味着您的原始代码可以编译。谢谢,它解决了不匹配问题,但现在无法解析++符号。请发布您的
merge
方法签名和
mergeMsg
函数。现在我有了
def merge[K,V](映射:Seq[scala.collection.Map[K,V]])(f:(K,V,V)=>V):scala.collection.Map[K,V]
。未更改
mergeMsg
函数。
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))
 }