Bryter ut av nestede løkker

1. Oversikt

I denne opplæringen vil vi lage noen eksempler for å vise forskjellige måter å bruke gå i stykker innenfor en løkke. Deretter vil vi også se hvordan du avslutter en løkke uten å bruke gå i stykker i det hele tatt.

2. Problemet

Nestede sløyfer er veldig nyttige, for eksempel for å søke i en liste over lister.

Et eksempel vil være en liste over studenter, der hver student har en liste over planlagte kurs. La oss si at vi vil finne navnet på en person som planla kurs 0.

Først vil vi gå gjennom listen over studenter. Så, inne i den løkken, vil vi løpe over listen over planlagte kurs.

Når vi skriver ut navnene på studentene og kursene, får vi følgende resultat:

student 0 kurs 0 kurs 1 student 1 kurs 0 kurs 1

Vi ønsket å finne den første studenten som planla kurs 0. Imidlertid, hvis vi bare bruker sløyfer, vil applikasjonen fortsette å søke etter at kurset er funnet.

Etter at vi har funnet en person som planla det spesifikke kurset, vi vil slutte å søke. Å fortsette å søke vil ta mer tid og ressurser mens vi ikke trenger ekstra informasjon. Derfor vil vi bryte ut av den nestede løkken.

3. Paus

Det første alternativet vi må ut av en nestet løkke er å bare bruke gå i stykker uttalelse:

Strengresultat = ""; for (int outerCounter = 0; outerCounter <2; outerCounter ++) {resultat + = "ytre" + outerCounter; for (int innerCounter = 0; innerCounter <2; innerCounter ++) {resultat + = "indre" + innerCounter; hvis (innerCounter == 0) {pause; }}} returner resultat;

Vi har en ytre sløyfe og en indre sløyfe, begge sløyfer har to iterasjoner. Hvis telleren til den indre sløyfen er lik 0, utfører vi gå i stykker kommando. Når vi kjører eksemplet, vil det vise følgende resultat:

outer0inner0outer1inner0

Eller vi kan justere koden for å gjøre den litt mer lesbar:

ytre 0 indre 0 ytre 1 indre 0

Er dette det vi vil ha?

Nesten, den indre sløyfen avsluttes av brudduttalelsenetter at 0 er funnet. Imidlertid fortsetter den ytre sløyfen, som ikke er det vi vil ha. Vi vil slutte å behandle helt så snart vi har svaret.

4. Merket pause

Det forrige eksemplet var et skritt i riktig retning, men vi må forbedre det litt. Vi kan gjøre det ved å bruke en merket pause:

Strengresultat = ""; myBreakLabel: for (int outerCounter = 0; outerCounter <2; outerCounter ++) {resultat + = "ytre" + outerCounter; for (int innerCounter = 0; innerCounter <2; innerCounter ++) {resultat + = "indre" + innerCounter; hvis (innerCounter == 0) {break myBreakLabel; }}} returner resultat;

EN merket break vil avslutte den ytre sløyfen i stedet for bare den indre sløyfen. Vi oppnår det ved å legge til myBreakLabel utenfor løkken og endre pausesetningen for å stoppe myBreakLabel. Etter at vi har kjørt eksemplet, får vi følgende resultat:

ytre0inner0

Vi kan lese det litt bedre med litt formatering:

ytre 0 indre 0

Hvis vi ser på resultatet, kan vi se det både den indre og den ytre sløyfen er avsluttet, det er det vi ønsket å oppnå.

5. Gå tilbake

Som et alternativ kan vi også bruke komme tilbake uttalelse for å returnere resultatet direkte når det er funnet:

Strengresultat = ""; for (int outerCounter = 0; outerCounter <2; outerCounter ++) {resultat + = "ytre" + outerCounter; for (int innerCounter = 0; innerCounter <2; innerCounter ++) {resultat + = "indre" + innerCounter; hvis (innerCounter == 0) {returresultat; }}} returner "mislyktes";

Etiketten fjernes og gå i stykker uttalelse erstattes av en komme tilbake uttalelse.

Når vi utfører koden ovenfor, får vi det samme resultatet som for den merkede pause. Merk at for at denne strategien skal fungere, trenger vi vanligvis å flytte blokken med sløyfer til sin egen metode.

6. Konklusjon

Så vi har nettopp sett på hva vi skal gjøre når vi trenger å gå ut tidlig fra en løkke, som når vi har funnet varen vi søker etter. De gå i stykker nøkkelord er nyttig for enkeltløkker, og vi kan bruke merket gå i stykkers for nestede løkker.

Alternativt kan vi bruke en komme tilbake uttalelse. Å bruke retur gjør koden bedre lesbar og mindre feilutsatt, ettersom vi ikke trenger å tenke på forskjellen mellom umerkede og merkede pauser.

Ta gjerne en titt på koden på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found