2013-07-25 9 views
6

Wie kann diese Karte ListeWie man eine Karte mit Listenwerten in Scala transponieren

Map (
    "a" -> List(1, 2) 
) 

auf diese Liste der Karten von den Scala-Bibliotheken in erster Linie Methoden umgesetzt werden?

List(
    Map("a" -> 1), 
    Map("a" -> 2) 
) 

Ich kann eine Lösung selbst codieren, aber ich bin mehr daran interessiert, sich mit der Bibliothek Funktionalität so die bevorzugte Lösung, um die Scala-Bibliothek verwenden sollten, wenn möglich, während die übrigen kompakt und mäßig lesbar.

Dieses zweite Beispiel veranschaulicht die erforderliche Transformation mit einer Zuordnung mit mehr als einem Eintrag.

Daraus

Map (
    10 -> List("10a", "10b", "10c"), 
    29 -> List("29a", "29b", "29c") 
) 

dazu

List(
    Map(
    10 -> "10a", 
    29 -> "29a"), 
    Map(
    10 -> "10b", 
    29 -> "29b"), 
    Map(
    10 -> "10c", 
    29 -> "29c") 
) 

Es kann angenommen werden, dass alle Werte Listen der gleichen Größe sind.

Optional könnte die Lösung den Fall behandeln, wo die Werte leere Listen sind, aber das ist nicht erforderlich. Wenn die Lösung leere Liste Werte unterstützt dann diese Eingabe,

Map (
    "a" -> List() 
) 

sollte in List() führen.

+2

Es ist * transponieren *, als * abflachen * –

+0

transponieren verwenden aktualisiert. –

Antwort

9
val m = Map (
    10 -> List("10a", "10b", "10c"), 
    29 -> List("29a", "29b", "29c") 
) 

m.map{ case (k, vs) => 
    vs.map(k -> _) 
}.toList.transpose.map(_.toMap) 

Beachten Sie, dass dies auch Ihre „leere Liste“ Griffe

+0

Dies passt perfekt zu meinen Anforderungen und besteht alle meine Unit-Tests. –

Verwandte Themen