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

How to merge two LinkedHashMaps[Int, ListBuffer[Int]] in Scala?

我找到了这个方法:

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}
    }

错误说: "Type mismatch, expected: mutable.Seq[Mutable.Map[NotInferedK, NotInferedV]], actual: mutable.Seq[Map[Int, List[ListBuffer[Int]]]]"

我该如何解决这个问题?我知道这很简单,但我是 scala 的新手。

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

您需要先将 LinkedHashMap 转换为正确的类型。执行此操作的最简单方法可能是在执行 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]
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。