web-dev-qa-db-ja.com

Scala 2つのリストを同時にループするfor

私はList[Message]およびList[Author]は同じ数のアイテムを持ち、各インデックスでMessageAuthorからのものになるように順序付けする必要があります。

また、ここでSmartMessageと呼ぶクラスもあり、コンストラクターは2つの引数を取ります:Messageと対応するAuthor

私がやりたいことは、List[SmartMessage]、2つの単純なリストのデータを組み合わせます。

追加の質問:ListはScalaで挿入順序を保持しますか? List[Message]およびList[Author]同じ順序で。

32
Blackbird

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_(および_Tuple3_)でzippedメソッドを使用することもできます。

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

ご覧のとおり、この場合はmapのパターンマッチングは不要です。

追加

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

コレクションには3つの主要なブランチがあります: SeqSet 、および Map

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

List in scalaは リンクリスト なので、追加するのではなく、要素を追加する必要があります。 パフォーマンス特性 を参照してくださいscalaコレクション。

67
senia