Bryder ud af indlejrede sløjfer

1. Oversigt

I denne vejledning opretter vi nogle eksempler for at vise forskellige måder at bruge pause inden for en løkke. Dernæst ser vi også, hvordan man afslutter en loop uden at bruge pause overhovedet.

2. Problemet

Indlejrede sløjfer er f.eks. Meget nyttige til at søge i en liste med lister.

Et eksempel ville være en liste over studerende, hvor hver studerende har en liste over planlagte kurser. Lad os sige, at vi vil finde navnet på en person, der planlagde kursus 0.

Først ville vi løbe over listen over studerende. Derefter, inde i den løkke, ville vi løbe over listen over planlagte kurser.

Når vi udskriver navnene på de studerende og kurser, får vi følgende resultat:

studerende 0 kursus 0 kursus 1 studerende 1 kursus 0 kursus 1

Vi ønskede at finde den første studerende, der planlagde kursus 0. Men hvis vi bare bruger sløjfer, fortsætter applikationen med at søge efter kurset er fundet.

Når vi har fundet en person, der planlagde det specifikke kursus, vi vil stoppe søgningen. At fortsætte med at søge ville tage mere tid og ressourcer, mens vi ikke har brug for de ekstra oplysninger. Derfor vil vi bryde ud af den indlejrede løkke.

3. pause

Den første mulighed, vi skal ud af en indlejret løkke, er simpelthen at bruge pause udmelding:

Strengresultat = ""; for (int ydre tæller = 0; ydre tæller <2; ydre tæller ++) {resultat + = "ydre" + ydre tæller; for (int innerCounter = 0; innerCounter <2; innerCounter ++) {resultat + = "indre" + innerCounter; hvis (innerCounter == 0) {pause; }}} returner resultat;

Vi har en ydre sløjfe og en indre sløjfe, begge sløjfer har to iterationer. Hvis tælleren på den indre sløjfe er lig med 0, udfører vi pause kommando. Når vi kører eksemplet, viser det følgende resultat:

ydre0inner0outer1inner0

Eller vi kunne justere koden for at gøre den lidt mere læselig:

ydre 0 indre 0 ydre 1 indre 0

Er det det, vi ønsker?

Næsten, den indvendige sløjfe afsluttes med pauseanmeldelsenefter 0 er fundet. Imidlertid fortsætter den ydre løkke, hvilket ikke er det, vi ønsker. Vi vil stoppe behandlingen fuldstændigt, så snart vi har svaret.

4. Mærket pause

Det forrige eksempel var et skridt i den rigtige retning, men vi er nødt til at forbedre det lidt. Det kan vi gøre ved at bruge en mærket pause:

Strengresultat = ""; myBreakLabel: for (int ydre tæller = 0; ydre tæller <2; ydre tæller ++) {resultat + = "ydre" + ydre tæller; for (int innerCounter = 0; innerCounter <2; innerCounter ++) {resultat + = "indre" + innerCounter; hvis (innerCounter == 0) {break myBreakLabel; }}} returner resultat;

EN mærket break vil afslutte den ydre sløjfe i stedet for bare den indre sløjfe. Det opnår vi ved at tilføje myBreakLabel uden for sløjfen og ændre pauseerklæringen for at stoppe myBreakLabel. Når vi har kørt eksemplet, får vi følgende resultat:

ydre0inner0

Vi kan læse det lidt bedre med noget formatering:

ydre 0 indre 0

Hvis vi ser på resultatet, kan vi se det både den indre sløjfe og den ydre sløjfe er afsluttet, hvilket er det, vi ønskede at opnå.

5. Retur

Som et alternativ kunne vi også bruge Vend tilbage erklæring for direkte at returnere resultatet, når det findes:

Strengresultat = ""; for (int ydre tæller = 0; ydre tæller <2; ydre tæller ++) {resultat + = "ydre" + ydre tæller; for (int innerCounter = 0; innerCounter <2; innerCounter ++) {resultat + = "indre" + innerCounter; hvis (innerCounter == 0) {returneres; }}} returner "mislykkedes";

Mærkaten fjernes og pause erklæring erstattes af en Vend tilbage udmelding.

Når vi udfører koden ovenfor, får vi det samme resultat som for den mærkede pause. Bemærk, at for at denne strategi skal fungere, er vi typisk nødt til at flytte blokken af ​​sløjfer til sin egen metode.

6. Konklusion

Så vi har lige set på, hvad vi skal gøre, når vi har brug for at gå ud tidligt fra en løkke, som når vi har fundet det emne, vi leder efter. Det pause nøgleord er nyttigt for enkelt sløjfer, og vi kan bruge mærket pauses til indlejrede løkker.

Alternativt kan vi bruge en Vend tilbage udmelding. Brug af retur gør koden bedre læsbar og mindre fejlbehæftet, da vi ikke behøver at tænke på forskellen mellem umærket og mærket pause.

Du er velkommen til at se koden over på GitHub.