2013-06-19 47 views
22

我有一個List[Message]和一個List[Author]具有相同數量的項目,應該排序,以便在每個索引,Message是從Author斯卡拉循環兩個列表同時

我也有類,我們將在這裏調用SmartMessage,帶有一個構造函數帶2個參數:a Message和相應的Author

我想要做的是創建一個List[SmartMessage],結合2個簡單列表的數據。

額外的問題:請問List在Scala中保留插入順序嗎?只是爲了確保我創建List[Message]List[Author]具有相同的順序。

+2

'zip'只能滿足3個列表。如果你有更多,你可能喜歡看這個問題/答案:http://stackoverflow.com/a/17072064/770361 –

回答

48

你可以使用zip

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

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

如果你不喜歡for-comprehensions你可以使用map

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

方法zip創建對集合。在這種情況下,List[(Message, Author)]

您也可以使用上Tuple2(和Tuple3zipped方法:

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

正如你可以看到你不需要模式匹配map在這種情況下。

額外

ListSeqSeq保持秩序。見scala collections overview

有3個主要分支的收藏:Seq,SetMap

  • Seq保留元素的順序。
  • Set不包含重複的元素。
  • Map包含從鍵到值的映射。

在斯卡拉Listlinked list,所以你應該在前面加上元素它,而不是追加。請參閱scala集合的Performance Characteristics

+0

謝謝senia!我不知道'zip' – Blackbird

+0

'zip'真棒! –

+0

將數據與列表一起壓縮爲空列表時,請記住的一件事是結果也是一個空列表。所以你可能想要確保你的代碼是可以的。否則,您可以先檢查其中一個列表是空的還是使用zipAll()以及默認值。 – markus