JAVA CIKLAI

Java įdėtiniai ciklai

Vieną ciklą galima įrašyti kito ciklo viduje. Tokia konstrukcija vadinama įdėtiniu ciklu (angl. nested loop) ir padeda apdoroti lenteles, tinklelius bei kelių matmenų duomenis.

Kaip veikia įdėtiniai ciklai?

Išorinis ciklas valdo pagrindinius kartojimus. Per kiekvieną jo iteraciją vidinis ciklas pradeda darbą iš naujo ir įvykdo visas savo iteracijas.

Ši programa sudaro paprastą trijų dienų planą, kuriame kiekvieną dieną yra du valgiai:

// Išorinis ciklas pereina per dienas
for (int diena = 1; diena <= 3; diena++) {
    System.out.println("Diena: " + diena);

    // Vidinis ciklas pereina per tos dienos valgius
    for (int valgis = 1; valgis <= 2; valgis++) {
        System.out.println("  Valgis: " + valgis);
    }
}
Konsolės rezultatas

Diena: 1
  Valgis: 1
  Valgis: 2
Diena: 2
  Valgis: 1
  Valgis: 2
Diena: 3
  Valgis: 1
  Valgis: 2

  1. Išorinis ciklas pradeda nuo pirmos dienos ir konsolėje parodo Diena: 1.
  2. Tada paleidžiamas vidinis ciklas. Jis parodo pirmą ir antrą tos dienos valgį.
  3. Vidiniam ciklui pasibaigus, programa grįžta į išorinį ciklą ir pereina prie antros dienos.
  4. Antrą dieną vidinis skaitiklis vėl pradeda nuo 1, todėl vėl parodomi du valgiai.
  5. Tas pats pakartojama trečią dieną. Taigi išorinis ciklas vykdomas 3 kartus, o vidinis – iš viso 3 × 2 = 6 kartus.

Dviejų matmenų tinklelio pavyzdys

Įsivaizduok mažą kino salę. Išoriniu ciklu galima pereiti per eiles, o vidiniu – per kiekvienos eilės vietas:

for (int eile = 1; eile <= 3; eile++) {
    for (int vieta = 1; vieta <= 4; vieta++) {
        System.out.print("[" + eile + ":" + vieta + "] ");
    }
    System.out.println();
}
Konsolės rezultatas

[1:1] [1:2] [1:3] [1:4]
[2:1] [2:2] [2:3] [2:4]
[3:1] [3:2] [3:3] [3:4]

  1. Išorinis skaitiklis eile pasirenka kino salės eilę: pirmą, antrą arba trečią.
  2. Kiekvienoje eilėje vidinis skaitiklis vieta pereina nuo 1 iki 4.
  3. Žymėjimas [2:3] reiškia antrą eilę ir trečią vietą.
  4. System.out.print() neperkelia žymeklio į naują eilutę, todėl keturios vietos parodomos greta.
  5. Vidiniam ciklui pasibaigus, tuščias System.out.println() pradeda naują konsolės eilutę kitai kino salės eilei.

Bendras iteracijų skaičius

Kai kiekvienas išorinio ciklo kartojimas paleidžia visą vidinį ciklą, bendras vidinio bloko vykdymų skaičius gaunamas sudauginus abiejų ciklų iteracijas:

int vietuSkaicius = 0;

for (int eile = 1; eile <= 3; eile++) {
    for (int vieta = 1; vieta <= 4; vieta++) {
        vietuSkaicius++;
    }
}

System.out.println("Iš viso vietų: " + vietuSkaicius);
Konsolės rezultatas

Iš viso vietų: 12

  1. Pradžioje vietuSkaicius yra 0.
  2. Išorinis ciklas pereina per 3 kino salės eiles.
  3. Kiekvienoje eilėje vidinis ciklas pereina per 4 vietas.
  4. Kiekvieną kartą radus vietą, vietuSkaicius++ padidina bendrą skaičių vienetu.
  5. Iš viso vidinis blokas įvykdomas 3 × 4 = 12 kartų, todėl konsolėje parodoma Iš viso vietų: 12.
3 eilės × 4 vietos = 12 vietų.

Pridėjus dar vieną įdėtinį ciklą, vykdymų skaičius dar kartą dauginamas, todėl dideliems duomenims svarbu įvertinti našumą.

Kur naudojami įdėtiniai ciklai?

  • lentelių eilutėms ir stulpeliams apdoroti;
  • dvimačiams masyvams ir matricoms pereiti;
  • kino salių, klasių ar kitų vietų planams sudaryti;
  • visoms dviejų duomenų rinkinių poroms palyginti;
  • pasikartojantiems raštams ir ataskaitoms generuoti.

Rašyk aiškius įdėtinius ciklus

Kiekvienam skaitikliui suteik prasmingą pavadinimą, pavyzdžiui, eile ir vieta. Tinkamos įtraukos padeda matyti, kuris blokas priklauso išoriniam, o kuris vidiniam ciklui.

Jei ciklų įdėjimo lygių tampa daug, dalį logikos verta perkelti į atskirą metodą.