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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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)):

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 


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

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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)

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

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