2013-07-24 6 views
7

Alles, was ich tun wollte, ist folgendes zu konvertieren:Liste in der Karte mit indicies als Schlüssel

List(2, 4, 6, 8, 10)-Map(0 -> 2, 1 -> 4, 2 -> 6, 3 -> 8, 4 -> 10). Mit anderen Worten, map index to value. Es sollte sehr einfach sein, aber mir fehlt etwas.

Kann jemand einen einfachen Weg vorschlagen, das zu tun?

UPD: Nur um die Lösung zu verallgemeinern. Sagen wir, dass ich eine zusätzliche Umwandlung von Werten durchführen muss. Zum Beispiel, um es mit List(_) zu wickeln. In unserem Fall:

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

+1

Warum nicht einfach wandeln es in eine 'IndexedSeq' (d. h. "myList.toIndexedSeq")? Es wird schneller und (wahrscheinlich) kompakter. –

+0

Ich brauche eine Karte, da ich einige zusätzliche Operationen im Feature mit Werten/Keys durchführen möchte. Aber ja, falls Sie einen schnellen Direktzugriff benötigen, wäre 'IndexedSeq' die beste Lösung. –

Antwort

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

Nur neugierig: Ist das der effizienteste Ansatz? –

+0

@ErikAllik Wenn Sie * Leistung * meinen, wird die handgeschriebene while-Schleife in engen Schleifen viel effizienter sein, aber wie bei den anderen Lösungen (zipWithIndex-basierte) sollte es dieselben Leistungsmerkmale aufweisen. –

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

Ist das nicht produzieren Wert -> Indexpaare, während Op will Index -> Wert? –

+0

Ja, repariere es. Ihre [Lösung] (http://stackoverflow.com/a/17828495/200266) ist jedoch schöner. – Debilski

+1

'_.swap' ist besser als Ihre Inline-Funktion;) – Nicolas

5

UPD: Falls Sie die Werte zu transformieren möchten, können Sie entweder eine der Lösungen verwenden können, die bereits geschrieben wurden und dann die Karte Ilses mapValues oder man könnte die Transformation vorher anwenden:

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