Kitört a beágyazott hurkokból
1. Áttekintés
Ebben az oktatóanyagban létrehozunk néhány példát, amelyek bemutatják a felhasználás különböző módjait szünet hurkon belül. Ezután azt is megtudhatjuk, hogyan lehet egy ciklust lezárni használat nélkül szünet egyáltalán.
2. A probléma
A beágyazott ciklusok nagyon hasznosak például a listák listáján való kereséshez.
Ilyen például a hallgatók listája, ahol minden hallgató rendelkezik a tervezett kurzusok listájával. Tegyük fel, hogy meg akarjuk találni egy tervezett személy nevét tanfolyam 0.
Először áttekintettük a hallgatók listáját. Aztán ezen a körön belül áttekintettük a tervezett tanfolyamok listáját.
Amikor kinyomtatjuk a hallgatók és tanfolyamok nevét, a következő eredményt kapjuk:
hallgató 0 tanfolyam 0 tanfolyam 1 hallgató 1 tanfolyam 0 tanfolyam 1
Meg akartuk találni az első hallgatót, aki tervezett tanfolyam 0. Ha azonban csak ciklusokat használunk, akkor az alkalmazás a pálya megtalálása után folytatja a keresést.
Miután találtunk egy személyt, aki megtervezte az adott tanfolyamot, abba akarjuk hagyni a keresést. A keresés folytatása több időt és erőforrást igényel, miközben nincs szükségünk további információkra. Ezért akarunk szakítani ki a beágyazott hurokból.
3. Törés
Az első lehetőség, amelyet ki kell választanunk egy beágyazott hurokból, az az, hogy egyszerűen használjuk a szünet nyilatkozat:
Karakterlánc eredménye = ""; for (int externalCounter = 0; externalCounter <2; externalCounter ++) {eredmény + = "külső" + externalCounter; for (int belső számoló = 0; belső számoló <2; belső számoló ++) {eredmény + = "belső" + belső számoló; if (internalCounter == 0) {törés; }}} visszatérési eredmény;
Van egy külső és egy belső hurok, mindkét hurok két iterációval rendelkezik. Ha a belső hurok számlálója megegyezik 0-val, akkor végrehajtjuk szünet parancs. Amikor a példát futtatjuk, a következő eredmény jelenik meg:
external0inner0outer1inner0
Vagy módosíthatjuk a kódot, hogy egy kicsit jobban olvasható legyen:
külső 0 belső 0 külső 1 belső 0
Ezt akarjuk?
Majdnem, a belső ciklust a break utasítás zárja lemiután 0 található. A külső hurok azonban folytatódik, amit nem akarunk. Teljesen le akarjuk állítani a feldolgozást, amint megvan a válasz.
4. Címkézett törés
Az előző példa jó irányba tett lépés volt, de egy kicsit javítanunk kell rajta. Ezt megtehetjük az a használatával feliratú törés:
Karakterlánc eredménye = ""; myBreakLabel: for (int externalCounter = 0; externalCounter <2; externalCounter ++) {eredmény + = "külső" + externalCounter; for (int belső számoló = 0; belső számoló <2; belső számoló ++) {eredmény + = "belső" + belső számoló; if (internalCounter == 0) {break myBreakLabel; }}} visszatérési eredmény;
A felcímkézve törés csak a belső hurok helyett véget vet a külső huroknak. Ezt a. Összeadásával érjük el myBreakLabel a cikluson kívül, és a törés utasítás megváltoztatásával állítsa le myBreakLabel. A példa futtatása után a következő eredményt kapjuk:
external0inner0
Kicsit jobban elolvashatjuk néhány formázással:
külső 0 belső 0
Ha megnézzük az eredményt, akkor ezt láthatjuk a belső és a külső hurok is véget ér, amit el akartunk érni.
5. Vissza
Alternatív megoldásként a Visszatérés utasítás az eredmény közvetlen visszaadásához, ha megtalálható:
Karakterlánc eredménye = ""; for (int externalCounter = 0; externalCounter <2; externalCounter ++) {eredmény + = "külső" + externalCounter; for (int belső számoló = 0; belső számoló <2; belső számoló ++) {eredmény + = "belső" + belső számoló; if (internalCounter == 0) {visszatérési eredmény; }}} return "sikertelen";
A címkét eltávolítjuk, és a szünet állítás helyébe a Visszatérés nyilatkozat.
A fenti kód végrehajtásakor ugyanazt az eredményt kapjuk, mint a címkézett törésnél. Ne feledje, hogy ennek a stratégiának a működéséhez általában a hurokblokkot a saját módszerébe kell áthelyeznünk.
6. Következtetés
Tehát csak megvizsgáltuk, mit tegyünk, amikor korán kell kilépnünk egy hurokból, például amikor megtaláltuk a keresett elemet. A szünet kulcsszó hasznos az egyhuroknál, és használhatjuk felcímkézve szünets beágyazott hurkok esetén.
Alternatív megoldásként használhatjuk a Visszatérés nyilatkozat. A return használata a kódot jobban olvashatóvá és kevésbé hibára hajlamossá teszi, mivel nem kell gondolkodnunk a felirat nélküli és a címkézett törések közötti különbségen.
Nézze meg nyugodtan a kódot a GitHubon.