2011-01-31 15 views
19

Jak przekonwertować zestaw ("a", "b", "c") na mapę ("a" -> 1, "b" -> 2, "c" -> 3)? Myślę, że to powinno działać z mapą.Scala Convert Set to Map

+2

Chcesz B do mapy do 2, ponieważ jest to drugie w zestawie? A może jest to druga litera alfabetu? Zestawy nie są zamawiane, jak wskazywały inne plakaty, więc pierwsze nie będą działać. –

Odpowiedz

30

zipWithIndex to prawdopodobnie to, czego szukasz. To zabierze Twoją kolekcję listów i stworzy nową kolekcję Krotek, dopasowując wartość do pozycji w kolekcji. Masz dodatkowy wymóg, chociaż - to wygląda jak rozpocząć swoją pozycje 1, zamiast 0, więc trzeba przekształcić te krotek:

Set("a","b","c") 
    .zipWithIndex //(a,0), (b,1), (c,2) 
    .map{case(v,i) => (v, i+1)} //increment each of those indexes 
    .toMap //toMap does work for a collection of Tuples 

jedną dodatkową uwagę - Zestawy nie zachować pozycję. Rozważ użycie struktury takiej jak Lista, jeśli chcesz, aby powyższa pozycja konsekwentnie działała.

+0

Tego właśnie chciałem. Dzięki. –

7

toMap działa tylko wtedy, gdy wprowadzony zestaw to pary klucz/wartość (np. Set (("a", 1), ("b", 2), ("c", 3))). Aby dostać to, czego chcesz, użyj zipWithIndex:

scala> Set("a","b","c") zipWithIndex 
    res5: scala.collection.immutable.Set[(java.lang.String, Int)] = Set((a,0), (b,1), (c,2)) 

EDIT: lub (jak w ciebie pierwotnego pytania :))

scala> Set("a","b","c") zip (1 to 3) toMap 

Edit2: Duh, zapomniałem toMap na koniec!

19

Tutaj jest inne rozwiązanie, które wykorzystuje Stream wszystkich liczb naturalnych rozpoczynających się od 1 do spakowane z Set:

scala> Set("a", "b", "c") zip Stream.from(1) toMap 
Map((a,1), (b,2), (c,3)) 
+0

+1, to jest najlepsza odpowiedź tutaj. – missingfaktor

2

to również działa:

(('a' to 'c') zip (1 to 3)).toMap