タプルのzipped
メソッドを使用すると便利です。 2つのコレクションを入れ、関数に2つの引数を渡してください!
(ar1,ar2).zipped.foreach((x,y) => println(x+y))
(あなたが(ar1 zip ar2)
と同じように)あなたは再び離れて取るために持っている各ペアを格納するタプルを構築する必要がないので、これは、書くことが便利で速いの両方です。 2つのコレクションのうちの短いものが使い果たされると、両方の形式のジップが停止します。
あなたはもっと複雑なもの(例えば、あなたがインデックスに数学を行う必要があります)を持っている場合は、標準的な解決策は、インデックスにzip圧縮することです:
ar1.zipWithIndex.foreach{ case(x,i) => println(x+ar2(i)) }
使用している方法は、より迅速かつコンパクトに行われています次のように便利です:
ar1.indices.foreach(i => println(ar1(i)+ar2(i)))
これは、最初のコレクションが2番目のコレクションよりも長くない場合にのみ有効です。また、範囲を明示的に指定することもできます。
(0 until (ar1.size min ar2.size)).foreach(i => println(ar1(i)+ar2(i)))
この問題を回避するには(あなたがやっていることが容易でないと、zip
とzipped
が好まれる理由がわかります。)
それは並列コレクションではありません(とあなたが.par
を呼び出さない限り、通常はそれがない場合)、可変変数で追跡するためにも、お勧めできませんが、可能です:
{ var i=-1; ar1.foreach{ x => i += 1; println(x+ar2(i)) } }
があります。これが必要なケースは非常に限られています(たとえば、他のコレクションの一部をスキップまたはバックトラックしたい場合など)。これをやりなまざるをえない場合は、通常、推論するのが簡単なコードになります。
も参照してくださいhttp://stackoverflow.com/questions/6833501/efficient-iteration-with-index-in-scala – Vadzim