Jednym bardzo wygodnym sposobem na to jest metoda zipped
na krotkach. Umieść dwie kolekcje, wydostań dwa argumenty do funkcji!
(ar1,ar2).zipped.foreach((x,y) => println(x+y))
ta jest wygodna do pisania i szybko, gdyż nie trzeba budować krotka do przechowywania każdej pary (tak jak z (ar1 zip ar2)
), które następnie trzeba rozbierać ponownie. Obie formy zip zatrzymują się, gdy krótszy z dwóch zbiorów jest wyczerpany.
Jeśli masz coś bardziej skomplikowanego (np trzeba zrobić matematyki na indeksie), roztwór kanoniczna jest zip w indeksie:
ar1.zipWithIndex.foreach{ case(x,i) => println(x+ar2(i)) }
Sposób używasz jest szybciej i zwięźle wykonanej w następujący sposób może być użyteczne:
ar1.indices.foreach(i => println(ar1(i)+ar2(i)))
chociaż działa to tylko wtedy, gdy pierwsza kolekcja nie jest dłuższa niż druga. Możesz również wyraźnie określić swoje zakresy:
(0 until (ar1.size min ar2.size)).foreach(i => println(ar1(i)+ar2(i)))
aby obejść ten problem. (Możesz zobaczyć, dlaczego są preferowane, chyba że to, co robisz, jest zbyt skomplikowane, aby to ułatwić.)
Jeśli nie jest to zbiór równolegle (i zwykle nie jest to chyba nazwać .par
), jest to również możliwe, choć nie zaleca, aby śledzić z zmienny zmiennej:
{ var i=-1; ar1.foreach{ x => i += 1; println(x+ar2(i)) } }
istnieje bardzo ograniczona liczba przypadków, w których jest to konieczne (np. jeśli chcesz pominąć lub cofnąć się do niektórych innych kolekcji); jeśli możesz tego uniknąć, zwykle będziesz miał kod, o którym łatwiej się zastanowić.
Zobacz także http://stackoverflow.com/questions/6833501/efficient-iteration-with-index-in-scala – Vadzim