Gyakorlati alapok
A foreach ciklus
Az előző, A for ciklus című fejezet részletesen ismertette az egyik legfontosabb iteráló utasítás működtetési elveit, lehetőségeit. Észrevettük, hogy a "klasszikus" for ciklus fejlécében a helyes futáshoz nagyon pontosan be kell állítanunk az iterálás szabályait. Nézzünk meg egy, már ismertetett példát:
public class Main {
public static void main(String[] args) {
for(int i = 1; i <= 5; i++){
System.out.print(i + " ");
}
}
}
Végeredmény:
1 2 3 4 5
A "klasszikus" for ciklus fejlécében tehát az iterálás műveletei nagyon pontosan beállíthatók, illetve az iteráló int i változó közvetlenül megszólítható. Lehetőségünk van arra is, hogy az iteráló művelet ne az összes elemet, hanem annak csak egy részhalmazát szűrje ki.
Például legyen most a feladat a páros számok listája 1 és 50 között. Ehhez a legkézenfekvőbb megoldás for ciklust használnunk, valamint közvetlen megszólítással az int i ciklusváltozót a páros tulajdonság feltétele szerint szűrni (if (i % 2 == 0)):
public class Main {
public static void main(String[] args) {
for (int i = 1; i < 50; i++){
if (i % 2 ==
0){
System.out.print(i + " ");
}
}
}
}
Végeredmény:
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48
Létezik egy olyan speciális for ciklus, amelynek fejléce jóval kevesebb információt tartalmaz, neve foreach ciklus. Használatának akkor van értelme, ha olyan tárolóobjektumokkal dolgozunk, amelyek:
-
mérete dinamikusan változik,
-
méretét nem ismerjük,
-
mérete nem lényeges,
-
a tárolóobjektum összes elemére szükségünk van,
...avagy a tárolóobjektum tartalmához gyorsan és zökkenőmentesen kívánunk hozzáférni.
Ilyen kiindulási pont lehet például a Tömblista nevű tárolóobjektum, amelynél nem szükséges méretének figyelése. Ehhez vagy ilyen jellegű objektum tartalmának iterálásos eléréséhez ideális a foreach ciklus használata:
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> tomblista = new ArrayList<String>();
tomblista.add("Cirbolya");
tomblista.add(" és ");
tomblista.add("Borbolya,");
tomblista.add(" Moha");
tomblista.add(" és ");
tomblista.add("Páfrány");
for (String element : tomblista) {
System.out.print(element);
}
}
}
Végeredmény:
Cirbolya és Borbolya, Moha és Páfrány
A foreach utasítás egyébként jól ismert PHP-programozók körében, hiszen ott gyakran kerül felhasználásra.
Most pedig hasonlítsuk össze a kétféle for ciklus működését egy egyszerű tömbműveleten keresztül!
Adott egy, 1 és 10 között növekvő számokat tartalmazó tömb:
int [] tomb = new int[]{1,2,3,4,5,6,7,8,9,10};
Tartalmának közvetlen eléréséhez a for ciklus fejlécét pontosan kell beállítanunk, másként könnyen rossz eredményt vagy indexhatár-túllépés nevű kivételt kapunk (java.lang.ArrayIndexOutOfBoundsException - ez egyfajta programozási hiba, amely megakasztja a program futását). Ezen okból az iterálás a tömb mérete - 1 értékig tart (i < tomb.length;), hiszen emlékezzünk vissza: a tömbindexelés mindig 0-tól kezdődik és tömbméret - 1-ig tart:
public class
Main {
public static void main(String[] args) {
int [] tomb = new int[]{1,2,3,4,5,6,7,8,9,10};
for(int i = 0; i < tomb.length; i++){
int szam = tomb[i];
System.out.print(szam + " ");
}
}
}
Végeredmény:
1 2 3 4 5 6 7 8 9 10
A fenti feltételek figyelembevételével a foreach ciklussal mindezzel nem kell bajlódnunk, hanem a fejlécben deklarálunk egy, a tömb típusával megegyező segédváltozót (itt int szam), majd egyszerű hivatkozással megadjuk az iterálandó tárolóobjektumot (itt tomb). Közöttük kötelezően kettőspontot (:) használunk:
for(int szam : tomb)
public class
Main {
public static void main(String[] args) {
int [] tomb = new int[]{1,2,3,4,5,6,7,8,9,10};
for(int szam : tomb){
System.out.print(szam + " ");
}
}
}
Végeredmény:
1 2 3 4 5 6 7 8 9 10
Természetesen lehetőségünk van arra, hogy a szam segédváltozón további szűréseket végezzünk el, hiszen rajta a foreach ciklusban a tomb minden egyes elemtartalma átfut:
public class
Main {
public static void main(String[] args) {
int [] tomb = new int[]{1,2,3,4,5,6,7,8,9,10};
for(int szam : tomb){
if(szam % 2 == 0){
System.out.print(szam + " ");
}
}
}
}
Végeredmény:
2 4 6 8 10