2013-06-19 20 views
22

Mam List[Message] i List[Author], które mają taką samą liczbę pozycji, i należy je zamówić, aby przy każdym indeksie numer Message pochodził z Author.Scala dla pętli na dwóch listach jednocześnie

Mam również klasę, którą nazwiemy tutaj SmartMessage, z konstruktorem przyjmującym 2 argumenty: a Message i odpowiadającym Author.

Co chcę zrobić, to stworzyć List[SmartMessage], łącząc dane z dwóch prostych list.

Dodatkowe pytanie: czy List zachowuje zamówienie reklamowe w Scali? Aby upewnić się, że utworzę List[Message] i List[Author] z taką samą kolejnością.

+2

'zip' wystarczy tylko na 3 listy. Jeśli masz więcej, możesz spojrzeć na to pytanie/odpowiedź: http://stackoverflow.com/a/17072064/770361 –

Odpowiedz

48

Można użyć zip:

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

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

Jeśli nie podoba for-comprehensions można użyć map:

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

Metoda zip tworzy zbiór par. W tym przypadku List[(Message, Author)].

Można również użyć zipped metodę na Tuple2 (i na Tuple3):

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

Jak widać nie ma potrzeby dopasowywania wzorców w map w tym przypadku.

Extra

List jest Seq i Seq zachowuje porządek. Zobacz scala collections overview.

Istnieją 3 główne gałęzie kolekcji: Seq, Set i Map.

  • Seq zachowuje kolejność elementów.
  • Set nie zawiera żadnych duplikatów elementów.
  • Map zawiera odwzorowania od klawiszy do wartości.

List w scala to linked list, więc powinieneś dodać do niego elementy, a nie dołączyć. Zobacz Performance Characteristics z kolekcji scala.

+0

Dzięki senia! Nie wiedziałem o "zip" – Blackbird

+0

'zip' jest niesamowity! –

+0

Jedną rzecz, o której należy pamiętać podczas zapisywania listy danych razem z pustą listą, jest to, że wynik będzie również pustą listą. Więc możesz chcieć upewnić się, że twój kod jest w porządku z tym. W przeciwnym razie możesz sprawdzić, czy jedna z list jest pusta jako pierwsza, lub użyj zipAll() z wartościami domyślnymi. – markus

Powiązane problemy