2017-06-14 2 views
1

Lets sagen, ich habe die folgende Liste:Scala Konvertieren Liste der Karten von Listen Karte basierend auf der Karte Key

val myList = List(Map(1 -> 1), Map(2 -> 2), Map(2 -> 7))

Ich mag diese Liste auf eine einzige Karte von Int konvertieren -> Liste (Int). Wenn wir doppelte Schlüssel haben, sollten beide Werte in der resultierenden Werteliste enthalten sein.

Map(2 -> List(7,2),1 -> List(1)) 

Ich kam mit dieser Arbeitslösung, aber es scheint übermäßig und klobig.

myList.foldLeft(scala.collection.mutable.Map[Int,List[Int]]()) {(result,element) => 
     for((k,v) <- element) { 
     if (result.keySet.contains(k)) { 
      result(k) = result(k).:: (v) 
     } else { 
      result += (k -> List(v)) 
     } 
     } 
     result 
    } 

Gibt es hier einen besseren oder effizienteren Ansatz?

Antwort

4
myList 
    .flatten 
    .groupBy(_._1) 
    .mapValues(_.map(_._2)) 
1

Sie können ein einfacher verwenden (aber wahrscheinlich weniger effizient) Code:

val myList = List(Map(1 -> 1), Map(2 -> 2), Map(2 -> 7)) 
val grouped = myList.flatMap(_.toList).groupBy(_._1).mapValues(l => l.map(_._2)) 
println(grouped) 

Karte (2 -> Liste (2, 7), 1 -> Liste (1))

Die Idee ist, zuerst List aller Tupel von allen inneren Map s zu bekommen und sie dann zu gruppieren.