2013-06-19 4 views
22

ho un List[Message] e un List[Author] che hanno lo stesso numero di elementi, e dovrebbe essere disposto in modo che ad ogni indice, il Message è dal Author.Scala ciclo oltre due liste contemporaneamente

Ho anche una classe che chiameremo qui SmartMessage, con un costruttore che accetta 2 argomenti: uno Message e il corrispondente Author.

Quello che voglio fare è creare un List[SmartMessage], combinando i dati delle 2 liste semplici.

Domanda aggiuntiva: List conserva l'ordine di inserimento in Scala? Solo per assicurarmi di creare List[Message] e un List[Author] con lo stesso ordine.

+2

'zip' è sufficiente per un massimo di 3 elenchi. Se ne hai ancora, ti potrebbe piacere dare un'occhiata a questa domanda/risposta: http://stackoverflow.com/a/17072064/770361 –

risposta

48

Si potrebbe utilizzare zip:

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

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

Se non ti piace for-comprehensions si potrebbe usare map:

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

Metodo zip crea insieme di coppie. In questo caso List[(Message, Author)].

Si potrebbe anche usare zipped metodo su Tuple2 (e Tuple3):

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

Come si può vedere che non è necessario il pattern matching in map in questo caso.

Extra

List è Seq e Seq ordine conserva. Vedi scala collections overview.

Ci sono 3 rami principali delle collezioni: Seq, Set e Map.

  • Seq conserva l'ordine degli elementi.
  • Set non contiene elementi duplicati.
  • Map contiene mappature da chiavi a valori.

List in Scala è linked list, così si dovrebbe anteporre gli elementi ad esso, non accodare. Vedi Performance Characteristics di scala collezioni.

+0

Grazie senia! Non sapevo che 'zip' – Blackbird

+0

' zip' è fantastico! –

+0

Una cosa da tenere a mente quando si blocca un elenco con i dati insieme a una lista vuota è che il risultato sarà anche una lista vuota. Quindi potresti voler assicurarti che il tuo codice sia a posto. In caso contrario, è possibile verificare prima che uno degli elenchi sia vuoto o utilizzare zipAll() con valori predefiniti. – markus