Liigu peamise sisu juurde

for tsükkel

Õppevideo antud teemal:

Sissejuhatus

Tsükkel (loop) võimaldab teatud reeglite alusel mingit koodiosa korduvalt käivitada.

Tsükli arhitektuur:

Javas on nelja liiki tsükleid:

  • for tsükkel
  • for-each tsükkel
  • while tsükkel
  • do-while tsükkel

Antud artikkel keskendub for ja for-each tsüklitele.

For-tsüklil on Javas kaks erinevat esitust - tavaline for-tsükkel ja for-each ehk for-in tsükkel. For-each tsüklit kasutatakse järjendite ja kollektsioonide korral.

for-tsükkel

for-tsükkel, teisisõnu kolmikpäisega tsükkel koosneb kolmest osast:

  1. Kood, mis täidetakse tsükli alguses.
  2. Tingimuslause
  3. Kood, mida täidetakse igal tsükli sammul ehk iteratsioonil

Süntaks:

for (initialization statement; condition check; increment) {
statement(s);
}

Tüüpiliselt on eeltegevusteks (initialization statement) mingitele muutujatele algväärtuste omistamised. Näiteks: int i = 0;. Sellisel juhul kirjeldatakse täisarvutüüpi muutuja i, mis on selle tsükli lokaalne muutuja (ehk muutuja i väärtus ei ole väljaspool tsüklit kasutatav) ja omistatakse sellele algväärtus 0.
Jätkamistingimus (condition check) tuleb seada nii, et tsüklit täidetaks täpselt vajalik arv kordi. Kuniks tingimus on tõene (true), jooksutatakse tsükli sisu.
Tsükli sammu järeltegevuseks (increment) on sageli mingi muutuja väärtuse suurendamine või vähendamine teatud arvu võrra. Näiteks i = i + 2; või i--;.

Näide:

// int i = 0    -> Initialization statement
// i < 5 -> Condition check
// i++ -> Increment
for (int i = 0; i < 5; i++) {
System.out.println("Hello!");
}

Sellise näite puhul väljastab for-tsükkel viis korda teksti "Hello!".

For-tsüklit saab kasutada ka selliselt, et mõni (kasvõi kõik) nendest kolmest osast on täitmata. Näiteks:

int i = 0;

for ( ; i < 10; i++) {
System.out.println(i);
}

Järgnevas näites on kõik kolm osa täitmata. Sellisel juhul on tegemist lõputu tsükliga:

for ( ; ; ) {
// your code goes here
}

for-each tsükkel

for-each-tsükklit ehk üle kogumi käivat tsükklit kasutatakse järjendite ja kollektsioonide korral. Seda saab kasutada ainult siis, kui ei ole vaja järjendi elemente omavahel võrrelda (indeksid peidetakse programmeerija eest ära, aga indeksita ei saa nt eelmist/järgmist elementi kätte), asendada ega eemaldada. Järjendit või kollektsiooni läbitakse ainult kindlas suunas.

Näide:

int[] numbers = {1,2,3,4,5};

for (int item : numbers) {
System.out.println("Count is: " + item);
}

// Output:
// Count is: 1
// Count is: 2
// Count is: 3
// Count is: 4
// Count is: 5
oht

NB!: Antud tsükliga ei ole võimalik sama kollektsiooni muuta ja lugeda. Selline tegevus lõppeb veateatega:

List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
for (int num : list) {
if (num % 2 == 0) {
list.remove(num);
}
}

// Outputs:
// ERROR!
// Exception in thread "main" java.util.ConcurrentModificationException
// ...

Viga saab vältida Iterator kasutamisega või olemasolevast listist koopia tegemisega.