Java/מערכים: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
אין תקציר עריכה
תגיות: עריכה ממכשיר נייד עריכה דרך האתר הנייד
החלפת הדף בתוכן "מנור המלך מנור הגבר מנור החתיך נמרוד 0 גם בנצי 0"
תגיות: החלפה blanking עריכה ממכשיר נייד עריכה דרך האתר הנייד
שורה 7:
נמרוד 0
 
גם בנצי 0
==מערכים משוכללים יותר==
[[תמונה:Array2.svg|left|thumb|180px|הדמיה של מערך דו מימדי פשוט בגודל 5X5 - תאי הזיכרון מסודרים בטבלה ריבועית, כאשר כל מקום בטבלה מסומן במספר שורה ומספר עמודה.]]
עד כה עסקנו במערכים בעלי מימד אחד, אותם ניתן לתאר באופן ציורי כשורה של "קופסאות", כאשר כל קופסא כזו היא משתנה מטיפוס פשוט כלשהו. כעת נראה סוגים מתקדמים יותר של מערכים.
 
===מערכים של אובייקטים===
נושא האובייקטים עדיין לא נלמד כאן, אך בקצרה - איברי המערך אינם מוגבלים להיות מטיפוסים פשוטים כמו int או String. איברי מערך יכולים להיות מוגדרים לפי הצורך, גם כאובייקטים. נזכיר כי גם המערך עצמו הוא אובייקט, לכן מערך שאיבריו הם אובייקטים הוא אובייקט שמכיל בתוכו אובייקטים אחרים.
 
===מערכים דו-מימדיים ורב מימדיים===
ניתן להגדיר מערך כך שיכיל אובייקטים. גם מערך הוא אובייקט, לכן - אנו יכולים להגדיר מערך שאיבריו הם מערכים, ובצורה כזו ליצור מערכים דו-מימדיים, תלת-מימדיים וכן הלאה. ג'אווה תומכת במערכים אלה, ומאפשרת ליצור ולעבוד בנוחות עם מערכים אלה.
{{הארה|גודל המערך הכולל הוא כפל מספר האיברים בכל מימד. כך למשל, מערך תלת-מימדי של 100X1000X1000 יגיע לגודל של 100000000 תאים. יש להיזהר שלא ליצור מערכים עצומים כאלה, שימלאו את זיכרון המחשב ועלולים לגרום לקריסת התוכנית}}
אם נעשה הקבלה לתחום המתמטיקה, ניתן להתבונן על מערך בגודל N כווקטור ממימד N, ועל מערך דו מימדי בגודל NxM - כ[[w:he:מטריצה|מטריצה]] בגודל NxM. נראה כעת כיצד משתמשים במערכים אלה בצורה מעשית.
 
====מערכים דו-מימדיים פשוטים====
מערך דו-מימדי פשוט ניתן ליצור בדומה למערך חד-מימדי, עם הבדל קל. נראה כאן דוגמה ליצירת מערך דו-מימדי שיכיל אוסף תקליטורים, כך שבכל תקליטור - רשימת השירים אותה הוא מכיל. נגביל את עצמנו לחמישה תקליטורים, אשר בכל אחד מהם 13 שירים, לכל היותר. המידע יאוכסן בצורה הבאה: ניקח מערך דו-מימדי מטיפוס String, בגודל 5x13, כל מערך (חד מימדי) יכיל תקליטור אחד, כאשר האיבר הראשון בכל מערך כזה יכיל את שם האלבום. נכריז על המערך:
{{קוד|<nowiki>String[][] music = new String[5][13];</nowiki>}}
גישה לתאי המערך תתבצע גם היא באופן דומה למה שכבר ראינו. נראה קטע קוד שמדפיס את כל איברי המערך:
<source lang = "java">
for(int i=0; i<5; i++) {
for(int j=0; j<13; j++) {
System.out.print(music[i][j]+"\t");
}
System.out.println();
}
</source>
כמו שניתן לראות, בצורה מקבילה ללולאות בהן משתמשים עם מערכים חד-מימדיים, במערך דו מימדי נוח להשתמש בשתי לולאות, אחת בתוך השנייה.
 
====מערכים לא אחידים====
הדרך שראינו קודם להכריז על מערך דו-מימדי היא הפשוטה ביותר, אך איננה הדרך היחידה לעשות זאת. נראה דרכים נוספות:
<source lang = "java">
String[][] music = {{"Album 1", "Song", "Another song"},
{"Album 2", "First Song", "Second song"},
{"Album 3", "First Song", "Second song", "Third song"},
{"Album 4"}};
</source>
כאן נוצר מערך בגודל שנקבע לפי המשתנים אותם הכנסנו אליו. מערך זה אינו בהכרח ריבועי - מספר האיברים בכל מערך חד-מימדי הוא שונה. כמו במערכים חד מימדיים שנוצרים בדרך זו, גם במערכים דו-מימדיים ניתן ליצור מערך בצורה כזו רק בעת איתחולו. שימו לב כי כל מערך חד-מימדי נכתב בתוך זוג צומדיים נפרדים, המופרדים בפסיק. דרך זו היא מוגבלת: ניתן לאתחל כך מערך רק אם עושים זאת בד בבד עם ההכרזה עליו. לא ניתן להכניס בצורה הזו ערכים למערך אחרי יצירתו - ההכרזה עליו, וזאת אפילו אם המערך לא אותחל עדיין.
 
הדרך האחרונה, אותה נציג כעת, ממחישה בצורה הטובה ביותר את היותו של המערך הדו-מימדי מבנה המורכב ממערכים חד מימדיים. נאתחל את המערך, ואז נאתחל כל מערך חד-מימדי בתוכו, בצורה הבאה:
 
אתחול:
{{קוד|<nowiki>String[][] music = new String[5][];</nowiki>}}
כעת מאתחלים את תתי המערכים שבתוכו. נאתחל את הראשון:
{{קוד|<nowiki>music[0] = new String[13];</nowiki>}}
את השני:
{{קוד|<nowiki>music[1] = new String[13];</nowiki>}}
וכנהוג במערכים, נוח הרבה יותר לעשות זאת בעזרת לולאה:
<source lang = "java">
for(int i=0; i<5; i++)
music[i] = new String[13];
</source>
חשוב - גישה למערך שהוכרז אך לא אותחל תביא לתקלת זמן ריצה (ולקריסת התוכנית) - יש לשים לב ולהימנע מטעויות כאלה.
 
====עבודה עם מערכים לא אחידים====
כאשר משתמשים במערכים שאינם אחידים בגודלם, קשה עד בלתי אפשרי להשתמש בלולאות כמו שראינו עד כה. לכן, כדאי להשתמש באפשרות length, שמאפשרת לדעת את גודל המערך. גודלו של מערך בשם arr יינתן לנו על ידי הפקודה {{קוד בשורה|arr.length}}. שתי הערות:
* בניגוד לאפשרות דומה שקיימת עם משתנים מטיפוס String, כאן אין צורך בסוגריים. תזכורת: כדי לקבל את אורכה של מחרוזת בשם str, נשתמש בפקודה {{קוד בשורה|str.length()}}.
* הנתון שמוחזר הוא מספר שלם, ששווה לגודל המערך. יש לזכור שמספור איברי המערך מתחיל ב-0, ולכן האינדקס (כלומר, המספר הסידורי) של האיבר האחרון אינו גודל המערך, אלא גודל המערך פחות אחד.
נראה דוגמה לשימוש ב-length:
<source lang = "java">
for(int i=0; i<music.length; i++) {
for(int j=0; j<music[i].length; j++) {
System.out.print(music[i][j]+"\t");
}
System.out.println();
}
</source>
זוהי דוגמה כמעט זהה לזו שכבר ראינו, שמדפיסה את כל איברי המערך הדו-מימדי music, אך כאן ניתן להדפיס (כמעט) בבטחה את המערך גם אם איננו יודעים בוודאות את הגדלים. נזכיר כי אם הכרזנו על מערך ולא אתחלנו אותו - התוכנית תקרוס.
 
====מערכים רב-מימדיים====
מערכים רב-מימדיים עובדים בצורה דומה לזו שכבר ראינו עם המערכים החד-מימדיים והדו-מימדיים, אך עם מספר מימדים גדול יותר. כך נכריז על מערך ארבע-מימדי:
{{קוד|<nowiki>int arr[][][][] = new int[10][9][8][7];</nowiki>}}
גם הגישה לאיברי מערך כזה היא, כפי שקל לצפות:
{{קוד|<nowiki>arr[0][0][0][0] = 1;</nowiki>}}
בדרך כלל אין צורך להשתמש במערכים בעלי יותר משני מימדים, לכן, לא נרחיב עוד בנושא ונסתפק בדוגמאות אלה.
 
{{Java|מוגבל=כן}}
 
[[קטגוריה:Java|מערכים]]