2013-06-19 8 views
22

私はList[Message]List[Author]の項目数が同じで、各インデックスでMessageAuthorであるように並べる必要があります。2つのリストを同時にループするためのスカラー

私はここではSmartMessageと呼ばれるクラスを持ち、コンストラクタは2つの引数: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) 

あなたが好きではない場合は、mapを使用することができfor-comprehensions

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

方法zipはペアのコレクションを作成します。この場合、List[(Message, Author)]

あなたはまたTuple2(およびTuple3上)にzippedメソッドを使用することができます。

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

あなたはこのケースでmapでパターンマッチングを必要としない見ることができるように。

エクストラ

ListSeqあるとSeqは順序を保持します。 scala collections overviewを参照してください。

Seq,およびMapの3つの主要な支店があります。

  • Seq要素の順序を保持します。
  • Setには重複する要素が含まれていません。
  • Mapには、キーから値へのマッピングが含まれています。 Scalaでは

Listlinked listあるので、あなたは追加しない、それに要素を付加する必要があります。スカラコレクションのPerformance Characteristicsを参照してください。

+0

ありがとうsenia!私は 'zip'について知らなかった – Blackbird

+0

' zip'はすばらしいです! –

+0

リストを空のリストとともに圧縮するときには、結果も空のリストになることに留意してください。だから、あなたのコードが大丈夫であることを確認したいかもしれません。それ以外の場合は、最初にリストの1つが空であることを確認するか、zipAll()をデフォルト値で使用します。 – markus