一個非常方便的方法是在元組上使用zipped
方法。放入兩個集合,獲取一個函數的兩個參數!
(ar1,ar2).zipped.foreach((x,y) => println(x+y))
這是既方便編寫和快速,因爲你並不需要建立一個元組來存儲每對(你會與(ar1 zip ar2)
),這你就必須重新拆開。當兩個集合中較短的一個用盡時,兩種形式的拉鍊停止。
如果你有更復雜的東西(例如,你需要做的索引數學),規範的解決方案是在索引號郵編:
ar1.zipWithIndex.foreach{ case(x,i) => println(x+ar2(i)) }
您正在使用的方法更快速和緊湊做如下所示,一個可以是有用的:
ar1.indices.foreach(i => println(ar1(i)+ar2(i)))
雖然這隻適用於如果第一個集合不再比第二個集合。您還可以指定您的範圍explecitly:
(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