טיול ב-2D מערך
הוצג| English | משמעות |
|---|---|
| nested loops/ˈnestɪd luːps/ | לולאות מקושרות |
| row-major order/rəʊ ˈmeɪdʒə ˈɔːdə/ | סדר רוחבי |
| enhanced for/enˈhænst fɔː/ | לולאת for משופרת |
רשת מלבנית חושפת גבול לולאה שגוי
- גריד (רשת) בעל שני שורות ושלושה עמודות. לולאה מוגבלת על ידי g.length לשני האינדקסים מבקרת רק בשני העמודות הראשונות.
- השתמש ב- r < g.length וב- c < g[r].length לכל שורה. הדבר מטפל גם בשורות באורכים שונים, בעוד ש-g[0].length מניח גריד מלא מלבני ואינו ריק.
לולאות מקוננות עבור רשת
- כדי לבקר בכל תא במערך 2-ממדי, השתמש ב-לולאות מצטבבות (מפרק 2). לולאה חיצונית על שורות, לולאה פנימית על עמודות:
for (int r = 0; r < g.length; r++) { for (int c = 0; c < g[r].length; c++) { ... g[r][c] ... } }הלולאה הפנימית עוברת על כל השורה לפני שהחיצונית עוברת לשורה הבאה.
סדר סריקה לפי שורות (Row-major)
- ציבוץ זה מבקר בתאים ב-סדר טור-עמוד: כל השורה 0, ולאחר מכן השורה 1, …
g[0][0], g[0][1], …, g[1][0], g[1][1], … - זהו סדר הקריאה הטבעי — מימין לשמאל, למעלה למטה. עבור רשת מלבנית שאינה ריקה, ניתן להשתמש בעמודות כהלולאה החיצונית כדי לבקר בתאים עמודה-עמודה. מערך 'ragged' דורש מדיניות ספציפית לעמודות שלא כל השורות מכילות.
הגרסה עם for-each
- לולאה מוגברת (enhanced for) על מערך 2-ממדי מחזירה שורה אחת (מערך 1-ממדי) בכל פעם.
for (int[] row : g) { for (int x : row) { ... x ... } } - המשתנה החיצוני הוא שורה שלמה; הפנימי עובר על ערכיה. משתנה הלולאה הגולמי אינו מעדכן תאים מאוחזים כאשר מוקצה מחדש. משתנה השורה נותר עדיין כייחוס, ולכן לולאה פנימית עם אינדקס יכולה לשנות
row[c].
טיול לפי שורות
לולאה חיצונית על שורות, פנימית על עמודות: 1,2,3,4,5,6.
איזה דפוס מוצג כאן מבקר בכל תא של מערך 2-D של מספרים שלמים שאינו null, כאשר כל הייחוסים לשורות הם לא null?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
חיצוני על שורות, פנימי על עמודות.
הלולאה החיצונית של הביקור בשורה-ראשית המוצג ל-2-D צריכה להיות מוגבלת על ידי...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
הלולאה החיצונית של השורות משתמשת ב-g.length; לולאת התאים הפנימית משתמשת ב-g[r].length, וזו מטפלת באורכי שורות לא שווים.
רשת בגודל 2 שורות ו-3 עמודות, כמה תאים לולאה מקוננת תבקר?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
שורות × עמודות = 2 × 3 = 6.
טיול לפי שורות מבקר בתאים בסדר...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
סדר שורה = משמאל לימין, מלמעלה למטה.
בתוך for (int[] row : g), המשתנה row הוא...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
המשתנה החיצוני of-each הוא מערך שורות.
שימוש ב-g.length עבור שתי גבולות הלולאה תמיד יגרום לחריגה בעת ביצוע על כל רשת מלבנית שאינה ריבועית.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
שגוי: ברשת בעלת 2 שורות ו-3 עמודות היא מבקרת רק שתי עמודות ומפספסת תאים בשקט. ברשת הגבוהה יותר מרחבה היא יכולה במקום זאת לעבור גבול שורה.
הגדרת גבולות נכונה
- גבול חיצוני:
r < g.length(שורות). גבול פנימי:c < g[r].length(אורך השורה הנוכחית). שימוש באורך שגוי ללולאה הוא באג עדין ברשתות שאינן מרובעות. - עבור רשת מלבנית שאינה ריקה,
g[0].lengthמספק גם את מספר העמודות המשותף, וגוף הלולאה הפנימית מתבצעrows × columnsפעמים. עבור שורות 'ragged', יש להוסיף את אורכי השורות; כל ייחוסי השורות חייבים להיות לא null.
השתמש בg.length לשורות ובg[r].length לתאים של השורה הנוכחית. שימוש במספר השורות כגבולות עליון ותחתון גם יחד עלול לדלג על עמודות ברשת רחבה או לגרום לחריגת גבול ברשת גבוהה. מערך חיצוני ריק אינו דורש גישה לg[0]; שורה עם ערך null דורשת מדיניות טיפול מפורשת לפני קריאת אורכה.
Order the cells visited in row-major traversal of a 2×2 grid.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
The inner loop finishes one row before the outer loop advances.
עבור int[][] g = {{1, 2, 3}, {}, {4}};, כמה תאים מבקר הביקור לפי שורה?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
הוסיפו את אורכי השורות: 3 + 0 + 1 = 4. השורה הריקה תורמת אף תא.
סיכום מערך 2-D:
for (int r = 0; r < g.length; r++)for (int c = 0; c < g[r].length; c++)sum += g[r][c];— מבקר בכל התאים שורה אחרי שורה, בהנחה שאין שורה היא null.
להעביר את הניתוח למקרה חדש
- עבור
int[][] g = {{1, 2, 3}, {}, {4}};, אורכי השורות הם 3, 0 ו1. הגבולות לפי-שורה מבקרים ארבעה תאים ומסכמים ל10;g[0].lengthאינו גבול תקף לכל שורה. - ניתן לשנות את row[c] באמצעות לולאה פנימית מאונדת; החזרת ערך primitive x בלולאה פנימית משופרת (enhanced loop) אינה עדכנת תא.
עבור שדרוג מערך דו-ממדי (2-D) עם לולאות מקוננות: חיצונית בשורות (r < g.length), פנימית בעמודות (c < g[r].length), בגישה לg[r][c]. זאת מבקרת בתאים בסדר דומיננטיות-שורה (סכום אורכי השורות; rows × columns לרשת מלבנית). לולאה פנימית משופרת (for (int[] row : g)) מעניקה הפניה לשורה אחת בכל פעם; הצבה למשתנה לולאה פנימית primitive אינה משנה תא מאוחסן.