מערכים רב-מימדיים

בג'אווה אין בעצם מערכים דו- או רב-מימדיים, אבל אפשר להגדיר מערך שכל איבר שלו הוא התייחסות למערך. השימוש במערכים מקוננים כאלה דומה לשימוש במערכים דו-מימדיים, כלומר מערכים שאיבריהם מתאימים לזוגות של אינדקסים (באופן דומה, למערכים תלת-מימדיים, שאיבריהם מתאימים לשלשות של אינדקסים, וכן הלאה). משתנה שמתייחס למערך של מערכים מוגדר על ידי טיפוס כגון int[][]. את שם הטיפוס הזה קוראים מימין לשמאל: מערך שכל אחד מאיבריו הוא מערך של שלמים.

הדרך השגרתית ביותר ליצור מערך כזה היא על ידי משפט כגון זה:

int[][] a = new int[12][];

הביטוי שמימין יוצר מערך עם שנים עשרה איברים שכל אחד מהם הוא התייחסות למערך של שלמים. זה סימון מעט מבלבל, משום שהסימון [12] של מספר איברי המערך החדש מפריד בין שני החלקים של הטיפוס של איברי המערך: int[]. הביטוי מחזיר התייחסות למערך החדש שנשמרת במשתנה a.

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

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

a[3] = new int[50];

לאחר הקצאה כזו, אפשר להתייחס לאיברים המערך החדש שנוצר בעזרת ביטויים כמו a[3][11] או a[3][49]. משמעות הביטוי האחרון, למשל, היא "האיבר החמישים במערך שהאיבר הרביעי של a מתייחס אליו. שימוש בביטוי כמו a[0][0] הוא שגיאה (לפחות בנקודה זו של הדוגמה), כי האיבר a[0] אינו מתייחס כרגע לשום מערך; ערכו הוא null.

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

int[][] a = new int[12][27];

יוצר בבת אחת שלושה עשר מערכים. שנים עשרה מערכים של 27 שלמים כל אחד, ומערך אחד של שתים עשרה התייחסויות שאיבריו מתייחסים כבר למערכים של השלמים.

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

שאלות

  1. תארי באופן סכמטי את מבנה הנתונים ש-a מתייחס אליו לאחר האתחול הבא:
    int[][] a = {{1,2},{3,4,5},{6,7}};