2010-02-03 12 views
22

Ich habe eine zwei Listen, eine List[A] und eine List[B]. Was ich will, ist ein Map[A,B], aber ich möchte die Semantik von zip. So begann wie so:Gibt es in Scala eine Möglichkeit, zwei Listen in eine Map umzuwandeln?

var tuplesOfAB = listOfA zip listOfB 

Jetzt bin ich nicht sicher, wie ein Map von meinem tuplesOfAB zu konstruieren.

Als eine Folgefrage möchte ich auch meine Karte invertieren, damit ich von Map[A,B] eine Map[B,A] erstellen kann. Kann mir jemand einen Anhaltspunkt geben?

+1

Dank dafür zu fragen. Ich kam hierher, um es zu finden. Jetzt muss ich es nicht selbst fragen. – wheaties

Antwort

26

In 2.8 das ist wirklich einfach mit der CanBuildFrom Funktionalität (as described by Daniel) und unter Verwendung von breakOut mit einer Art Anweisung an den Compiler, was das Ergebnis Typ sein sollte:

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

Die folgende würde funktioniert auch:

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

Und (wie EastSun, unten, hat darauf hingewiesen) wurde dies hinzugefügt Bibliothek als toMap

val o = (listA zip listB).toMap 

Wie für die Karte umgekehrt, können Sie tun:

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

val m = (listA zip listB) toMap funktioniert auch in scala 2.8 – Eastsun

+0

Ah! Diese Methode existiert nicht in der Build von 2.8 die ich habe (r20327) –

+1

ja, es wurde vor kurzem hinzugefügt, nachdem paulp gezeigt hat, wie einfach es war, es als Antwort auf eine andere Frage zu schreiben. Er schlug dann vor, es der lib hinzuzufügen, da jede andere große Sammlung bereits vertreten war. –

15

Nun, da Sie eine Liste von Tupeln haben, ist es leicht, sie in eine Karte zu schreiben, indem Sie Map(tuplesOfAB: _*) schreiben. Die : _* Schreibweise bedeutet, die Varargs-Überladung mit den Argumenten aus der Sequenz zu benennen. Dies scheint wie ein lustiges bisschen Syntax, aber es hilft zu denken, dass varargs wie Map[A,B](pairs: (A,B)*) deklariert werden und die : _* ist eine Typ-Annotation in varargs wegen der gemeinsamen * Teil zu konvertieren.

Zum Umkehren einer Karte mMap(m.map(_.swap): _*) verwenden. In Scala ist eine Karte auch eine Sammlung von Paaren. Dadurch werden diese Paare transformiert, indem die Elemente ausgetauscht und an den Map-Konstruktor übergeben werden.

+0

Das ist schön, danke! –

5

Es gibt noch eine andere Möglichkeit, es zu tun, über den bereits angezeigten. Hier:

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