פורץ מלולאות מקוננות

1. סקירה כללית

במדריך זה ניצור כמה דוגמאות להראות דרכים שונות לשימוש לשבור בתוך לולאה. לאחר מכן נראה גם כיצד לסיים לולאה ללא שימוש לשבור בכלל.

2. הבעיה

לולאות מקוננות מאוד שימושיות, למשל, לחיפוש ברשימת רשימות.

דוגמה אחת תהיה רשימה של סטודנטים, כאשר לכל סטודנט יש רשימה של קורסים מתוכננים. נניח שאנחנו רוצים למצוא את שמו של אדם אחד שתכנן קורס 0.

ראשית, נעבור על רשימת התלמידים. ואז, בתוך הלולאה ההיא, נעבור על רשימת הקורסים המתוכננים.

כאשר אנו מדפיסים את שמות הסטודנטים והקורסים נקבל את התוצאה הבאה:

סטודנט 0 קורס 0 קורס 1 סטודנט 1 קורס 0 קורס 1

רצינו למצוא את התלמיד הראשון שתכנן קורס 0. עם זאת, אם רק נשתמש בלולאות אז היישום ימשיך בחיפוש לאחר מציאת הקורס.

לאחר שנמצא אדם שתכנן את הקורס הספציפי, אנחנו רוצים להפסיק לחפש. המשך החיפוש ייקח יותר זמן ומשאבים בזמן שאיננו זקוקים למידע הנוסף. לכן אנחנו רוצים להישבר מתוך הלולאה המקוננת.

3. הפסקה

האפשרות הראשונה שיש לנו לצאת מלולאה מקוננת היא פשוט להשתמש ב- לשבור הַצהָרָה:

תוצאת מחרוזת = ""; עבור (int חיצוני מונה = 0; מונה חיצוני <2; מונה חיצוני ++) {תוצאה + = "חיצוני" + מונה חיצוני; עבור (int innerCounter = 0; innerCounter <2; innerCounter ++) {result + = "inner" + innerCounter; אם (innerCounter == 0) {הפסקה; }}} להחזיר את התוצאה;

יש לנו לולאה חיצונית ולולאה פנימית, לשתי הלולאות יש שני איטרציות. אם המונה של הלולאה הפנימית שווה 0 אנו מבצעים את לשבור פקודה. כאשר אנו מריצים את הדוגמה, היא תציג את התוצאה הבאה:

חיצוני 0inner0 outer1inner0

לחלופין נוכל להתאים את הקוד כך שיהיה מעט קריא יותר:

0 חיצוני 0 פנימי 0 חיצוני 1 פנימי 0

האם זה מה שאנחנו רוצים?

כִּמעַט, הלולאה הפנימית מסתיימת על ידי הצהרת הפסקהלאחר שנמצא 0. עם זאת, הלולאה החיצונית נמשכת, וזה לא מה שאנחנו רוצים. אנו רוצים להפסיק את העיבוד לחלוטין ברגע שיש לנו את התשובה.

4. הפסקה שכותרתה

הדוגמה הקודמת הייתה צעד בכיוון הנכון, אך עלינו לשפר אותה מעט. אנו יכולים לעשות זאת באמצעות הפסקה שכותרתה:

תוצאת מחרוזת = ""; myBreakLabel: עבור (int outerCounter = 0; outerCounter <2; outerCounter ++) {result + = "חיצוני" + דלפק חיצוני; עבור (int innerCounter = 0; innerCounter <2; innerCounter ++) {result + = "inner" + innerCounter; אם (innerCounter == 0) {break myBreakLabel; }}} להחזיר את התוצאה;

א שכותרתו הפסקה תסיים את הלולאה החיצונית במקום רק את הלולאה הפנימית. אנו משיגים זאת על ידי הוספת ה- myBreakLabel מחוץ לולאה ושינוי הצהרת ההפסקה לעצירה myBreakLabel. לאחר הפעלת הדוגמה נקבל את התוצאה הבאה:

0 חיצוני 0

אנחנו יכולים לקרוא את זה קצת יותר טוב עם קצת עיצוב:

0 חיצוני 0 פנימי

אם נסתכל על התוצאה נוכל לראות זאת גם הלולאה הפנימית וגם הלולאה החיצונית מסתיימים, וזה מה שרצינו להשיג.

5. לחזור

כחלופה, נוכל גם להשתמש ב- לַחֲזוֹר הצהרה להחזרת התוצאה ישירות כאשר היא תימצא:

תוצאת מחרוזת = ""; עבור (int חיצוני מונה = 0; מונה חיצוני <2; מונה חיצוני ++) {תוצאה + = "חיצוני" + מונה חיצוני; עבור (int innerCounter = 0; innerCounter <2; innerCounter ++) {result + = "inner" + innerCounter; אם (innerCounter == 0) {תוצאת החזרה; }}} להחזיר "נכשל";

התווית מוסרת וה- לשבור הצהרה מוחלפת בא לַחֲזוֹר הַצהָרָה.

כאשר אנו מבצעים את הקוד לעיל אנו מקבלים את אותה התוצאה כמו עבור ההפסקה שכותרתה. שים לב שכדי שאסטרטגיה זו תפעל, בדרך כלל עלינו להעביר את גוש הלולאות לשיטה משלה.

6. מסקנה

אז רק בדקנו מה לעשות כשצריך לצאת מוקדם מלולאה, כמו כשמצאנו את הפריט אותו אנו מחפשים. ה לשבור מילת המפתח מועילה לולאות בודדות, ואנחנו יכולים להשתמש בתווית לשבורלולאות מקוננות.

לחלופין, אנו יכולים להשתמש ב- לַחֲזוֹר הַצהָרָה. השימוש בתמורה הופך את הקוד לקריא יותר ופחות נוטה לשגיאות מכיוון שאיננו צריכים לחשוב על ההבדל בין הפסקות ללא תווית.

אל תהסס להעיף מבט בקוד ב- GitHub.


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