2013-06-19 5 views
22

Ich habe ein List[Message] und ein List[Author], die die gleiche Anzahl von Elementen haben, und bestellt werden soll, so dass die von den MessageAuthor bei jedem Index ist.Scala zur Schleife über zwei Listen gleichzeitig

Ich habe auch Klasse, die wir hier anrufen SmartMessage, mit einem Konstruktor, der 2 Argumente: a Message und die entsprechende Author.

Was ich tun möchte, ist eine List[SmartMessage] zu erstellen, die Daten der 2 einfachen Listen kombiniert.

Zusätzliche Frage: funktioniert List Konservierung Reihenfolge in Scala? Nur um sicherzustellen, dass ich List[Message] und eine List[Author] mit der gleichen Reihenfolge erstellen.

+2

'zip' reicht nur bis zu 3 Listen. Wenn Sie mehr haben, möchten Sie vielleicht diese Frage/Antwort zu sehen: http://stackoverflow.com/a/17072064/770361 –

Antwort

48

könnten Sie zip verwenden:

val ms: List[Message] = ??? 
val as: List[Author] = ??? 

var sms = for ((m, a) <- (ms zip as)) yield new SmartMessage(m, a) 

Wenn Sie nicht mögen for-comprehensions Sie map verwenden:

var sms = (ms zip as).map{ case (m, a) => new SmartMessage(m, a)} 

Methode zip schafft Sammlung von Paaren. In diesem Fall List[(Message, Author)].

var sms = (ms, as).zipped.map{ (m, a) => new SmartMessage(m, a)} 

Wie Sie Sie keine Musterabgleich in diesem Fall in map müssen sehen:

Sie auch zipped Methode auf Tuple2 (und auf Tuple3) nutzen könnten.

Extra-

List ist Seq und Seq bewahrt Ordnung. Siehe scala collections overview.

Es gibt 3 Hauptzweige von Sammlungen: Seq, Set und Map.

  • Seq bewahrt die Reihenfolge der Elemente.
  • Set enthält keine doppelten Elemente.
  • Map enthält Zuordnungen von Schlüsseln zu Werten.

List in scala ist linked list, so dass Sie Elemente, um es voranstellen sollte, nicht anhängen. Siehe Performance Characteristics von Scala-Sammlungen.

+0

Danke senia! Ich wusste nicht über 'zip' – Blackbird

+0

' zip' ist genial! –

+0

Beim Zippen einer Liste mit Daten zusammen mit einer leeren Liste ist zu beachten, dass das Ergebnis auch eine leere Liste sein wird. Sie sollten also sicherstellen, dass Ihr Code in Ordnung ist. Andernfalls können Sie zuerst nach einer leeren Liste suchen oder zipAll() mit den Standardwerten verwenden. – markus