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
Odpowiedz
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.
Tego właśnie chciałem. Dzięki. –
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!
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))
+1, to jest najlepsza odpowiedź tutaj. – missingfaktor
to również działa:
(('a' to 'c') zip (1 to 3)).toMap
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ć. –