1.1-Introductie-Programmeren

Theorie Loops 3

Competentie: Ik kan een index-gebaseerde loop gebruiken en bepalen wanneer ik welke loop-soort het beste kan gebruiken.

Specifieke leerdoelen:

De opdrachten staan in de verschillende submodulen.

Samenvatting

Een for-loop met een index gebruiken.

Een index-gebaseerde for-loop gebruik je om een bepaald aantal keer een stuk code uit te voeren. Je gebruikt het vaak als je precies weet hoe vaak iets uitgevoerd moet worden.

De lus ziet er als volgt uit:

for(start; condition; step){
    //Code
}

Een voorbeeld:

for(int i = 0; i < 10; i++) { 
    //Code
}

Elke for-loop is altijd om te schrijven naar een while-loop. Onderstaande while-loop is inhoudelijk aan de bovengenoemde for-loop.

int i=0;

while(i<10){
    //Code
    i++;
}

De for-loop wordt veel gebruikt omdat het “handiger” is om op deze manier een lus te maken. Dankzij de syntax van de for-loop staat namelijk de teller initialisatie, de conditie en de ophoging van de teller in 1 regel in plaats van dat het door je code verspreid staat. Dit maakt het eenvoudiger om te lezen en kan je op 1 plek alle informatie vinden die je nodig hebt om de lus te snappen.

Door een ArrayList lopen

Om door een ArrayList heen te kunnen lopen (te itereren) met een index (teller), moet je weten hoeveel elementen er in het array staan. Wanneer we bijv. een ArrayList van String’s genaamd arrLst hebben, dan kunnen we dit als volgt doen:

for(int i = 0; i < arrLst.size(); i++) {
    String item = arrLst.get(i);
    SaxionApp.printLine(item);
}

Enhanced for Loop

Je kunt ook door iedere item van een ArrayList (of array’s, die later nog worden behandeld) lopen door gebruik te maken van de enhanced for-loop, die je al eerder hebt gezien. Het voorgaande voorbeeld ziet er met de enhanced for-loop dan als volgt uit:

for (String item: arrLst) {
    SaxionApp.printLine(item);
}

Dit doet dus precies hetzelfde, maar is wel een stuk korter en duidelijker. Wanneer je dus de index (de loop variabele i in het vorige code voorbeeld) dus niet nodig hebt, heeft deze enhanced for-loop dan ook de voorkeur.

Welke loop gebruik je precies wanneer?

Een overzicht van de vier loop-soorten in Java, met nadruk op wanneer je wel of niet de index nodig hebt.

Overzicht

Loop Wanneer gebruiken Voorbeeldsituatie Index beschikbaar? Kort voorbeeld
while Aantal iteraties onbekend. Je gaat door totdat een voorwaarde klopt. Doorgaan totdat de gebruiker stop typt of totdat de input geldig is. Nee, hooguit extern aangeleverd indien nodig. while (!input.equals("stop")) { ... }
enhanced for Je loopt langs alle elementen en de positie in de rij interesseert je niet. Elke naam in een lijst afdrukken. Nee. for (String name : names) { ... }
index based for Aantal iteraties bekend, of je hebt de index nodig, of je loopt op een andere manier door de rij. Positie tonen, in stappen van 2 lopen, achterstevoren lopen, of twee arrays parallel doorlopen. Ja. for (int i = 0; i < names.length; i++) { ... }
do-while (komt wat minder vaak voor) Zelfde als while, maar de body moet minimaal één keer draaien. Eerst input vragen, daarna pas controleren of die geldig was. Nee, hooguit extern aangeleverd indien nodig. do { ... } while (!valid);

De index als beslissende factor

Het verschil tussen de enhanced for en de index based for zit volledig in de index.

De enhanced for is comfort: je krijgt elk element aangereikt en hoeft je niet met een teller bezig te houden. Maar je weet niet op welke positie je zit.

De index based for is controle: je hebt i in handen en kunt daarmee dingen doen die met een enhanced for niet lukken.

De vuistregel voor studenten: pak een enhanced for, tenzij je iets met de positie moet doen. Dan is de index based for de juiste keuze.

De while heeft van zichzelf geen index. In principe heeft die dus geen positie, en als je er toch een nodig hebt, lever je die extern aan met een eigen teller. Datzelfde geldt voor de do-while. Verder geldt voor de while en do-while loop, dat je deze inzet op het moment dat je niet weet hoevaak iets moet worden herhaald.

Codevoorbeelden

Enhanced for (geen index nodig)

for (String name : names) {
    SaxionApp.printLine(name);
}

Index based for, index gebruiken (positie tonen)

for (int i = 0; i < names.length; i++) {
    SaxionApp.printLine(i + ": " + names[i]);
}

Index based for, stappen van 2

for (int i = 0; i < names.length; i += 2) {
    SaxionApp.printLine(names[i]);
}

Index based for, achterstevoren

for (int i = names.length - 1; i >= 0; i--) {
    SaxionApp.printLine(names[i]);
}

Index based for, twee arrays parallel op dezelfde index

for (int i = 0; i < names.length; i++) {
    SaxionApp.printLine(names[i] + " is " + ages[i] + " years old");
}

De laatste vier voorbeelden zijn precies de gevallen waarin een enhanced for niet volstaat. Goed materiaal om te laten zien waarom je soms toch de index wilt hebben.