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

时间:2017-12-02 12:14:39

标签: 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(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]]]]”

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

2 个答案:

答案 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。