Ответ 1
Один очень удобный способ сделать это с помощью метода zipped
для кортежей. Поместите две коллекции в, выведите два аргумента функции!
(ar1,ar2).zipped.foreach((x,y) => println(x+y))
Это удобно писать и быстро, так как вам не нужно создавать кортеж для хранения каждой пары (как и с (ar1 zip ar2)
), которую вам нужно снова разделить. Обе формы zip останавливаются при исчерпании более короткой из двух коллекций.
Если у вас есть что-то более сложное (например, вам нужно сделать математику по индексу), каноническое решение - закрепить в индексе:
ar1.zipWithIndex.foreach{ case(x,i) => println(x+ar2(i)) }
Используемый вами метод быстрее и компактно выполняется следующим образом: может быть полезно:
ar1.indices.foreach(i => println(ar1(i)+ar2(i)))
хотя это работает только в том случае, если первая коллекция не больше второй. Вы также можете указать свои диапазоны:
(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)) } }
Существует очень ограниченное число случаев, когда это необходимо (например, если вы можете пропустить или вернуться к некоторым другим коллекциям); если вы не можете этого сделать, вы, как правило, получите код, который легче рассуждать.