Una forma muy conveniente de hacerlo es con el método zipped
en tuplas. Pon dos colecciones, ¡saca dos argumentos para una función!
(ar1,ar2).zipped.foreach((x,y) => println(x+y))
Esto es cómodo para escribir y rápido, ya que no es necesario construir una tupla para almacenar cada par (como lo haría con (ar1 zip ar2)
) que luego se tiene que desmontar de nuevo. Ambas formas de zip se detienen cuando se agota la colección más corta.
Si usted tiene algo más complicado (por ejemplo, que hay que hacer matemáticas en el índice), la solución canónica es la cremallera en el índice:
ar1.zipWithIndex.foreach{ case(x,i) => println(x+ar2(i)) }
El método que está utilizando es más hecho rápidamente y de forma compacta de la siguiente manera, una puede ser útil:
ar1.indices.foreach(i => println(ar1(i)+ar2(i)))
aunque esto sólo funciona si la primera colección ya no que el segundo es. También puede especificar los rangos explícitamente:
(0 until (ar1.size min ar2.size)).foreach(i => println(ar1(i)+ar2(i)))
para solucionar este problema. (Puede ver por qué se prefieren zip
y zipped
a menos que lo que esté haciendo sea demasiado complicado para que esto funcione fácilmente.)
Si no es una colección paralela (y por lo general no lo es menos que llame .par
), también es posible, aunque no se recomienda, para realizar un seguimiento con una variable mutable:
{ var i=-1; ar1.foreach{ x => i += 1; println(x+ar2(i)) } }
Hay una un número muy limitado de casos en que esto es necesario (por ejemplo, si desea saltear o retroceder en alguna de las otras colecciones); Si puede evitar tener que hacer esto, generalmente terminará con un código que es más fácil de razonar.
Véase también http://stackoverflow.com/questions/6833501/efficient-iteration-with-index-in-scala – Vadzim