2013-07-24 11 views
7

Chciałam zrobić, to przekonwertować następujące:Konwersja listy Scala na mapie z indeksów jak klucze

List(2, 4, 6, 8, 10) do Map(0 -> 2, 1 -> 4, 2 -> 6, 3 -> 8, 4 -> 10). Innymi słowy, indeks mapy do wartości. To powinno być bardzo łatwe, ale czegoś mi brakuje.

Czy ktoś może zaproponować prosty sposób na zrobienie tego?

UPD: Tylko uogólnić rozwiązanie. Powiedzmy, że muszę wykonać dodatkowe przekształcenie wartości. Na przykład, aby opakować go za pomocą List(_). W naszym przypadku:

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

+1

Dlaczego nie po prostu przekonwertować go na 'IndexedSeq' (tj. 'myList.toIndexedSeq')? Będzie szybszy i (prawdopodobnie) bardziej zwarty. –

+0

Potrzebuję mapy, ponieważ zamierzam wykonać dodatkową operację w funkcji wartości/kluczy. Ale tak, na wypadek gdybyś potrzebował szybkiego losowego dostępu, najlepszym rozwiązaniem byłby 'IndexedSeq'. –

Odpowiedz

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

Po prostu ciekawy: czy uważasz, że jest to najbardziej efektywne podejście? –

+0

@ErikAllik, jeśli masz na myśli * wydajność *, myślę, że napisana ręcznie pętla będzie znacznie wydajniejsza w ciasnych pętlach, ale tak jak w przypadku innych wymienionych tutaj rozwiązań (opartych na ZipWithIndex) powinna ona wykazywać te same cechy wydajności. –

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

Czy to nie produkuje wartości -> pary indeksów, podczas gdy op chce indeksu -> wartość? –

+0

Tak, naprawiłem to. Twoje [rozwiązanie] (http://stackoverflow.com/a/17828495/200266) jest jednak ładniejsze. – Debilski

+1

'_.swap' jest lepsza niż twoja funkcja inline;) – Nicolas

5

UPD: w przypadku, gdy chcesz, aby przekształcić wartości, można użyć jednego z rozwiązań, które zostały już zamieszczone, a następnie korzystać z mapy na mapValues lub można zastosować przekształcenie wcześniej:

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