2010-02-03 11 views
22

Mam dwie listy: List[A] i List[B]. To, czego chcę, to Map[A,B], ale chcę semantyki zip. Więc zaczęło się tak:W Scala, czy istnieje sposób na przekształcenie dwóch list w mapę?

var tuplesOfAB = listOfA zip listOfB 

Teraz nie jestem pewien, jak skonstruować Map z mojego tuplesOfAB.

Jako pytanie uzupełniające, chcę również odwrócić mapę, tak aby z Map[A,B] mogę utworzyć Map[B,A]. Czy ktoś może mnie uderzyć klejem?

+1

Dzięki za pytaniem to. Przyszedłem tutaj, aby go znaleźć. Teraz nie muszę o to pytać. – wheaties

Odpowiedz

26

W 2,8 to jest bardzo proste przy użyciu funkcjonalności CanBuildFrom (as described by Daniel) i stosując breakOut z typem dyspozycję do kompilatora, co typ wynik powinien być:

import scala.collection.breakOut 
val m = (listA zip listB)(breakOut): Map[A,B] 

Poniższy będzie działa również:

val n: Map[A,B] = (listA zip listB)(breakOut) 

I (jak zauważył EastSun, poniżej) zostało to dodane do Biblioteka jako toMap

val o = (listA zip listB).toMap 

chodzi o odwrócenie mapę, można zrobić:

val r = m.map(_.swap)(breakOut): Map[B, A] 
+4

val m = (lista list zip B) do mapowania działa również w scala 2.8 – Eastsun

+0

Ah! Ta metoda nie istnieje w wersji 2.8, którą mam (r20327) –

+1

tak, została ostatnio dodana po tym, jak paulp pokazał, jak łatwo było ją napisać, w odpowiedzi na inne pytanie. Następnie zasugerował dodanie go do biblioteki, ponieważ każda inna duża kolekcja była już reprezentowana. –

15

Teraz, gdy masz listę krotek, łatwo jest utworzyć mapę, pisząc Map(tuplesOfAB: _*). Notacja : _* oznacza wywołanie przeciążenia varargs z argumentami wziętymi z sekwencji. Wydaje się to zabawną częścią składni, ale pomaga myśleć, że varargs są zadeklarowane jako Map[A,B](pairs: (A,B)*), a : _* jest adnotacją typu do konwersji na varargs z powodu wspólnej części *.

Aby odwrócić mapę m użyj Map(m.map(_.swap): _*). W scala mapa to także zbiór par. Przekształca te pary, zamieniając elementy i przekazując je do konstruktora Map.

+0

To jest piękne, dzięki! –

5

Jest jeszcze inny sposób, aby to zrobić, poza tymi już widoczne. Tutaj:

Map() ++ tuplesOfAB 
4
scala> List("a", "f", "d") zip List(7, 5, 4, 8) toMap 
res0: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 7, f -> 5, d -> 4) 
Powiązane problemy