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:
fortsükkelfor-eachtsükkelwhiletsükkeldo-whiletsü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:
- Kood, mis täidetakse tsükli alguses.
- Tingimuslause
- 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
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.