Probijanje ugniježđenih petlji

1. Pregled

U ovom uputstvu stvorit ćemo nekoliko primjera koji će pokazati različite načine upotrebe pauza unutar petlje. Dalje, također ćemo vidjeti kako prekinuti petlju bez upotrebe pauza uopće.

2. Problem

Ugniježđene petlje vrlo su korisne, na primjer, za pretraživanje popisa popisa.

Jedan od primjera bio bi popis studenata, gdje svaki student ima popis planiranih tečajeva. Recimo da želimo pronaći ime jedne osobe koja je planirala tečaj 0.

Prvo bismo premotali popis učenika. Zatim bismo unutar te petlje prešli preko popisa planiranih tečajeva.

Kada ispišemo imena studenata i tečajeva, dobit ćemo sljedeći rezultat:

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

Željeli smo pronaći prvog učenika koji je planirao tečaj 0. Međutim, ako samo koristimo petlje, aplikacija će nastaviti tražiti nakon pronalaska tečaja.

Nakon što pronađemo osobu koja je planirala određeni tečaj, želimo prestati tražiti. Nastavak pretraživanja potrajao bi više vremena i resursa, dok nam ne trebaju dodatne informacije. Zato se želimo slomiti izvan ugniježđene petlje.

3. Prekid

Prva opcija koju moramo izaći iz ugniježđene petlje je jednostavna upotreba pauza izjava:

Rezultat niza = ""; za (int externalCounter = 0; externalCounter <2; externalCounter ++) {rezultat + = "vanjski" + externalCounter; za (int innerCounter = 0; innerCounter <2; innerCounter ++) {rezultat + = "unutarnji" + innerCounter; if (innerCounter == 0) {break; }}} vrati rezultat;

Imamo vanjsku i unutarnju petlju, obje petlje imaju dvije iteracije. Ako je brojač unutarnje petlje jednak 0, izvršavamo pauza naredba. Kad pokrenemo primjer, pokazat će sljedeći rezultat:

external0inner0outer1inner0

Ili bismo mogli prilagoditi kod kako bismo ga učinili malo čitljivijim:

vanjski 0 unutarnji 0 vanjski 1 unutarnji 0

Je li to ono što želimo?

Skoro, unutarnja petlja završava se naredbom breaknakon što se pronađe 0. Međutim, vanjska petlja se nastavlja, što nije ono što želimo. Želimo potpuno zaustaviti obradu čim dobijemo odgovor.

4. Označeni odmor

Prethodni je primjer bio korak u dobrom smjeru, ali moramo ga malo poboljšati. To možemo učiniti pomoću a označena prekid:

Rezultat niza = ""; myBreakLabel: za (int externalCounter = 0; externalCounter <2; externalCounter ++) {result + = "external" + externalCounter; za (int innerCounter = 0; innerCounter <2; innerCounter ++) {rezultat + = "unutarnji" + innerCounter; if (innerCounter == 0) {break myBreakLabel; }}} vrati rezultat;

A označen break će završiti vanjsku petlju umjesto samo unutarnju petlju. To postižemo dodavanjem myBreakLabel izvan petlje i mijenjanje naredbe break da se zaustavi myBreakLabel. Nakon pokretanja primjera dobivamo sljedeći rezultat:

vanjski0unutarnji0

Možemo ga pročitati malo bolje s nekim oblikovanjem:

vanjski 0 unutarnji 0

Ako pogledamo rezultat to možemo vidjeti unutarnja i vanjska petlja su završene, što smo i željeli postići.

5. Povratak

Kao alternativu mogli bismo koristiti i povratak izjava za izravni povratak rezultata kad se pronađe:

Rezultat niza = ""; za (int externalCounter = 0; externalCounter <2; externalCounter ++) {rezultat + = "vanjski" + externalCounter; za (int innerCounter = 0; innerCounter <2; innerCounter ++) {rezultat + = "unutarnji" + innerCounter; if (innerCounter == 0) {return rezultat; }}} return "nije uspjelo";

Oznaka se uklanja i znak pauza Izjava se zamjenjuje s povratak izjava.

Kada izvršimo gornji kod, dobit ćemo isti rezultat kao i za označeni prekid. Imajte na umu da za funkcioniranje ove strategije obično moramo premjestiti blok petlji u vlastitu metodu.

6. Zaključak

Dakle, upravo smo pogledali što učiniti kada trebamo izaći ranije iz petlje, kao kad smo pronašli stavku koju tražimo. The pauza ključna riječ korisna je za pojedinačne petlje i možemo je koristiti označenom pauzas za ugniježđene petlje.

Alternativno, možemo koristiti a povratak izjava. Korištenje return čini kod bolje čitljivim i manje sklonim pogreškama jer ne moramo razmišljati o razlici između neoznačenih i označenih prekida.

Slobodno pogledajte kod preko GitHub-a.