Andrea
Andrea

Reputation: 47

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

I found this method:

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

but it gives me a type mismatch error if i use it like this:

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

The error says: "Type mismatch, expected: mutable.Seq[Mutable.Map[NotInferedK, NotInferedV]], actual: mutable.Seq[Map[Int, List[ListBuffer[Int]]]]"

How can i solve this? I know it's something simple, but i'm new to scala.

Upvotes: 0

Views: 205

Answers (2)

user unknown
user unknown

Reputation: 36229

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

So the Type needs just to be converted to Map. The k is not used for the process of updating, so we use _ instead. The lbs are for ListBuffers.

Upvotes: 0

Chris C
Chris C

Reputation: 229

The problem is that you are passing in to merge a sequence of mutable LinkedHashMaps. The function requires a sequence of immutable Maps.

You need to convert your LinkedHashMaps to the correct type first. The simplest way to do this is probably to call .toMap before you perform the mapValues.

merge(ms.map(_.toMap.mapValues(List(_)))){(_, v1, v2) => v1 ++ v2}

Update

Alternatively the method signature for Merge can be change to explicitly use scala.collection.Map. It will, by default, use 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]

Upvotes: 1

Related Questions