2013-07-24 17 views
7

Tutto quello che volevo fare è quello di convertire il seguente:Convertire lista di Scala nella mappa con indicies come chiavi

List(2, 4, 6, 8, 10)-Map(0 -> 2, 1 -> 4, 2 -> 6, 3 -> 8, 4 -> 10). In altre parole, mappa l'indice da valutare. Dovrebbe essere molto facile, ma mi manca qualcosa.

Qualcuno può suggerire un modo semplice per farlo?

UPD: Solo per generalizzare la soluzione. Diciamo che ho bisogno di eseguire un'ulteriore transormazione dei valori. Ad esempio, per avvolgerlo con List(_). Nel nostro caso:

List(2, 4, 6, 8, 10) ->Map(0 -> List(2), 1 -> List(4), 2 -> List(6), 3 -> List(8), 4 -> List(10))

+1

Perché non basta convertirlo in un 'IndexedSeq' (Ad esempio, 'myList.toIndexedSeq')? Sarà più veloce e (probabilmente) più compatto. –

+0

Ho bisogno di una mappa, poiché sto pianificando di eseguire qualche operazione aggiuntiva nella funzione con valori/chiavi. Ma sì, nel caso in cui se hai bisogno di un rapido accesso casuale, 'IndexedSeq' sarebbe la soluzione migliore. –

risposta

13
val xs = List(2, 4, 6, 8, 10) 
(xs.indices zip xs).toMap 
// Map(0 -> 2, 1 -> 4, 2 -> 6, 3 -> 8, 4 -> 10) 
+0

Solo curioso: pensi che sia l'approccio più efficiente? –

+0

@ErikAllik se intendi * prestazioni *, penso che la scrittura manuale mentre il ciclo sarà molto più efficiente nei loop stretti, ma come per le altre soluzioni qui elencate (basate su zipWithIndex) dovrebbe mostrare le stesse caratteristiche di performance. –

15
List(2, 4, 6, 8, 10).zipWithIndex.map(_.swap).toMap 
+0

Questo valore non produce -> coppie di indici, mentre op vuole indice -> valore? –

+0

Sì, risolto. La tua [soluzione] (http://stackoverflow.com/a/17828495/200266) è più bella, però. – Debilski

+1

'_.swap' è migliore della funzione inline;) – Nicolas

5

UPD: Nel caso in cui si desidera trasformare i valori, è possibile utilizzare una delle soluzioni che sono già state pubblicate e quindi utilizzare la mappa del mapValues o si potrebbe applicare la trasformazione in anticipo:

List(2, 4, 6, 8, 10).zipWithIndex.map { case (v, i) => i -> List(v) }.toMap 
res0: Map[Int,List[Int]] = Map(0 -> List(2), 1 -> List(4), 2 -> List(6), 3 -> List(8), 4 -> L 
ist(10)) 
Problemi correlati