Prelomenie vnorených slučiek

1. Prehľad

V tomto tutoriáli si vytvoríme niekoľko príkladov, ktoré ukazujú rôzne spôsoby použitia prestávka v slučke. Ďalej tiež uvidíme, ako ukončiť slučku bez použitia prestávka vôbec.

2. Problém

Vnorené slučky sú veľmi užitočné, napríklad na vyhľadávanie v zozname zoznamov.

Jedným z príkladov by mohol byť zoznam študentov, kde má každý študent zoznam plánovaných kurzov. Povedzme, že chceme nájsť meno jednej osoby, ktorá to plánovala kurz 0.

Najskôr by sme prechádzali zoznamom študentov. Potom sme sa v tejto slučke prehnali zoznamom plánovaných kurzov.

Keď vytlačíme mená študentov a kurzov, dostaneme nasledujúci výsledok:

študent 0 kurz 0 kurz 1 študent 1 kurz 0 kurz 1

Chceli sme nájsť prvého študenta, ktorý to plánoval kurz 0. Ak však použijeme iba slučky, bude aplikácia pokračovať v hľadaní aj po nájdení kurzu.

Keď nájdeme osobu, ktorá naplánovala konkrétny kurz, chceme prestať hľadať. Pokračovanie v hľadaní by vyžadovalo viac času a zdrojov, kým nepotrebujeme ďalšie informácie. Preto sa chceme rozbiť z vnorenej slučky.

3. Prestávka

Prvá možnosť, ktorú musíme opustiť vnorenú slučku, je jednoducho použiť prestávka vyhlásenie:

Výsledok reťazca = ""; pre (int vonkajšíCounter = 0; vonkajšíCounter <2; vonkajšíCounter ++) {výsledok + = "vonkajší" + vonkajšíCounter; for (int innerCounter = 0; innerCounter <2; innerCounter ++) {result + = "internal" + innerCounter; if (innerCounter == 0) {break; }}} vrátiť výsledok;

Máme vonkajšiu slučku a vnútornú slučku, obe slučky majú dve iterácie. Ak je počítadlo vnútornej slučky rovné 0, vykonáme prestávka príkaz. Keď spustíme príklad, zobrazí sa nasledujúci výsledok:

vonkajší

Alebo by sme mohli upraviť kód tak, aby bol trochu čitateľnejší:

vonkajší 0 vnútorný 0 vonkajší 1 vnútorný 0

Je to to, čo chceme?

Takmer vnútorná slučka je ukončená príkazom breakpo nájdení 0. Vonkajšia slučka však pokračuje, čo nie je to, čo chceme. Hneď ako dostaneme odpoveď, chceme úplne zastaviť spracovanie.

4. Označený zlom

Predchádzajúci príklad bol krokom správnym smerom, musíme ho však trochu vylepšiť. Môžeme to urobiť pomocou a označený zlom:

Výsledok reťazca = ""; myBreakLabel: pre (int vonkajšíCounter = 0; vonkajšíCounter <2; vonkajšíCounter ++) {výsledok + = "vonkajší" + vonkajšíCounter; for (int innerCounter = 0; innerCounter <2; innerCounter ++) {result + = "internal" + innerCounter; if (innerCounter == 0) {break myBreakLabel; }}} vrátiť výsledok;

A označené zlom ukončí vonkajšiu slučku, nielen vnútornú. Dosiahneme to pridaním myBreakLabel mimo slučky a zmena príkazu break na stop myBreakLabel. Po spustení príkladu dostaneme nasledujúci výsledok:

vonkajší0vnútorný0

S niektorým formátovaním to môžeme čítať o niečo lepšie:

vonkajší 0 vnútorný 0

Ak sa pozrieme na výsledok, môžeme to vidieť vnútorná slučka aj vonkajšia slučka sú ukončené, čo sme chceli dosiahnuť.

5. Vráťte sa

Ako alternatívu by sme mohli použiť aj návrat príkaz na priame vrátenie výsledku, keď sa zistí:

Výsledok reťazca = ""; pre (int vonkajšíCounter = 0; vonkajšíCounter <2; vonkajšíCounter ++) {výsledok + = "vonkajší" + vonkajšíCounter; for (int innerCounter = 0; innerCounter <2; innerCounter ++) {result + = "internal" + innerCounter; if (innerCounter == 0) {vrátiť výsledok; }}} vrátiť "zlyhalo";

Štítok je odstránený a prestávka vyhlásenie sa nahrádza a návrat vyhlásenie.

Keď vykonáme vyššie uvedený kód, dostaneme rovnaký výsledok ako pri zlomku s označením. Upozorňujeme, že aby táto stratégia fungovala, je zvyčajne potrebné presunúť blok slučiek do jeho vlastnej metódy.

6. Záver

Takže sme sa práve pozreli na to, čo robiť, keď potrebujeme ukončiť slučku skôr, ako keď sme našli hľadanú položku. The prestávka kľúčové slovo je užitočné pre jednotlivé slučky a môžeme použiť štítok prestávkas pre vnorené slučky.

Prípadne môžeme použiť a návrat vyhlásenie. Použitie návratu robí kód lepšie čitateľným a menej náchylným na chyby, pretože nemusíme myslieť na rozdiel medzi neoznačenými a označenými zlommi.

Pokojne sa pozrite na kód na GitHub.


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