2013-07-25 11 views
6

Come può questa mappa di lista,Come trasporre una mappa con i valori dell'elenco a Scala

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

essere trasposta nella lista delle mappe in primo luogo con metodi delle librerie Scala?

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

posso codice una soluzione me, ma io sono più interessato a utilizzare la funzionalità della libreria in modo che la soluzione preferita dovrebbe utilizzare la libreria Scala, ove possibile, pur rimanendo compatto e moderatamente leggibile.

Questo secondo esempio illustra la trasformazione richiesto con una mappa con più di una voce.

Da questo,

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

a questo,

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

Si può presumere che tutti i valori sono elenchi delle stesse dimensioni.

Opzionalmente la soluzione in grado di gestire il caso in cui i valori sono elenchi vuoti, ma che non è necessaria. Se la soluzione supporta i valori elenco vuoto, allora questo ingresso,

Map (
    "a" -> List() 
) 

dovrebbe provocare List().

+2

E 'più * trasposizione *, che * * appiattire –

+0

aggiornato per utilizzare trasposizione. –

risposta

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) 

Si noti che questo si occupa anche la vostra "lista vuota" caso

+0

Questo risponde perfettamente alle mie esigenze e supera tutti i miei test unitari. –