一个非常方便的方法是在元组上使用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