JAVA CIKLAI

Java for-each ciklas

for-each ciklas nuosekliai pereina visus masyvo arba kitos elementus. Jam nereikia atskiro skaitiklio ar elemento indekso.

Kada naudojamas for-each?

Šis ciklas tinka, kai kiekvieną duomenų rinkinio elementą reikia perskaityti ta pačia tvarka ir nėra svarbi jo pozicija. Dėl trumpesnės sintaksės kodas dažnai tampa aiškesnis nei naudojant įprastą for su sąlyga i < masyvas.length.

for-each sintaksė

for (elementoTipas elementas : duomenuRinkinys) {
    // Kodas vykdomas kiekvienam elementui
}
Šis sintaksės šablonas konsolės rezultato neturi.

Jis tik parodo vietas, kuriose reikia įrašyti tikrą elemento tipą, jo pavadinimą ir duomenų rinkinį.

  • Elemento tipas turi atitikti duomenų rinkinyje saugomų reikšmių tipą.
  • Elemento kintamasis per kiekvieną iteraciją gauna kitą rinkinio reikšmę.
  • Duomenų rinkinys gali būti masyvas arba, pavyzdžiui, Java kolekcija.
  • Ženklas : skaitomas kaip „kiekvienam elementui iš rinkinio“.

Tekstų masyvo perėjimas

Turime tris vaisius. for-each ciklas paima juos po vieną ir parodo konsolėje:

String[] vaisiai = {"Obuolys", "Kriaušė", "Bananas"};

for (String vaisius : vaisiai) {
    System.out.println("Vaisius: " + vaisius);
}
Konsolės rezultatas

Vaisius: Obuolys
Vaisius: Kriaušė
Vaisius: Bananas

  1. vaisiai yra tarsi viena lentyna su trimis dėžutėmis: obuoliu, kriauše ir bananu.
  2. Pirmą kartą ciklo kintamasis vaisius gauna tekstą Obuolys.
  3. Antrą kartą jis gauna Kriaušė, o trečią – Bananas.
  4. Kiekvieną gautą reikšmę println() parodo atskiroje konsolės eilutėje.
  5. Po paskutinio vaisiaus ciklas baigiasi automatiškai. Mums nereikia patiems didinti skaitiklio.

Skaičių apdorojimas

Jonas nusipirko keturis paprastus produktus. Jų kainas galima sudėti naudojant for-each:

int[] kainos = {2, 3, 5, 4};
int bendraKaina = 0;

for (int kaina : kainos) {
    bendraKaina += kaina;
}

System.out.println("Bendra kaina: " + bendraKaina + " eurų");
Konsolės rezultatas

Bendra kaina: 14 eurų

  1. Masyve kainos saugomos keturios kainos: 2, 3, 5, 4.
  2. Kintamasis bendraKaina pradžioje yra 0, nes dar nieko nesudėjome.
  3. Per kiekvieną kartojimą kintamasis kaina gauna vieną masyvo skaičių.
  4. Komanda bendraKaina += kaina prideda tą skaičių prie ankstesnės sumos. Ji auga taip: 2, 5, 10, 14.
  5. Pasibaigus ciklui, konsolėje parodoma galutinė suma – 14 eurų.

for ir for-each palyginimas

String[] vardai = {"Jonas", "Ona", "Rūta"};

// Įprastas for: turime indeksą
for (int i = 0; i < vardai.length; i++) {
    System.out.println("Indeksas " + i + ": " + vardai[i]);
}

// for-each: tiesiogiai gauname elementą
for (String vardas : vardai) {
    System.out.println("Vardas: " + vardas);
}
Konsolės rezultatas

Indeksas 0: Jonas
Indeksas 1: Ona
Indeksas 2: Rūta
Vardas: Jonas
Vardas: Ona
Vardas: Rūta

  1. Abu ciklai pereina tą patį vardų masyvą ir mato Joną, Oną bei Rūtą.
  2. Įprastas for turi skaitiklį i, todėl gali parodyti ir vardą, ir jo indeksą.
  3. Masyvo indeksai prasideda nuo 0, todėl Jono indeksas yra 0, Onos – 1, o Rūtos – 2.
  4. for-each tiesiogiai gauna kiekvieną vardą, todėl jo kodas trumpesnis, tačiau indekso neturi.
  5. Jeigu reikia tik perskaityti visus vardus, paprastesnis for-each dažniausiai yra aiškesnis.
Įprasto for ir for-each pasirinkimas
PoreikisTinkamesnis ciklas
Perskaityti visus elementus iš eilėsfor-each
Naudoti elemento indeksąfor
Pereiti tik dalį masyvofor
Pereiti elementus kitu žingsniu ar atbulaifor

Svarbūs for-each ribojimai

for-each tiesiogiai nepateikia dabartinio elemento indekso. Be to, primityviojo tipo ciklo kintamajam priskyrus kitą reikšmę, pats masyvo elementas nepasikeičia:

int[] taskai = {10, 20, 30};

for (int taskas : taskai) {
    taskas *= 2;
}

System.out.println(taskai[0]);
Konsolės rezultatas

10

  1. Masyve saugomos trys tikrosios reikšmės: 10, 20, 30.
  2. Per kiekvieną kartojimą taskas gauna vienos reikšmės kopiją.
  3. Komanda taskas *= 2 padvigubina tik šią laikiną kopiją.
  4. Originali masyvo dėžutė nekeičiama, todėl pirmasis elementas ir toliau yra 10.
  5. Dėl to System.out.println(taskai[0]) konsolėje parodo 10, o ne 20.
Ciklo kintamasis taskas gauna reikšmės kopiją.

Jei reikia pakeisti konkrečius primityviųjų reikšmių masyvo elementus, naudok įprastą for ir indeksą.