آرایه دندانه دار

آرایه دندانه دار یا jagged array آرایه‌ای چند بعدی است که دارای سطرهای با طول متغیر می‌باشد. نمونه ساده‌ای از آرایه‌های چند بعدی، آرایه‌های مستطیلی است که تعداد ستون‌ها و سطرهای آنها برابر است. اما آرایه‌های دندانه دار دارای سطرهای (آرایه‌های) با طول متفاوت می‌باشند. بنابراین آرایه‌های دندانه دار را می‌توان آرایه‌ای از آرایه‌ها فرض کرد. دستور نوشتن این نوع آرایه‌ها به صورت زیر است :

datatype[][] arrayName;

ابتدا datatype که نوع آرایه است و سپس چهار کروشه باز و بسته و بعد از آن نام آرایه را می‌نویسیم. مقداردهی به این آرایه‌ها کمی گیج کننده است. به مثال زیر توجه کنید :

int[][] myArrays = new int[3][];

myArrays[0] = new int[3];
myArrays[1] = new int[5];
myArrays[2] = new int[2];

در کد بالا سه آرایه تعریف شده است که اندیس آنها از صفر شروع می‌شود. اعداد 3 و 5 و 2 هم به تعداد عناصری که هر کدام از آنها در خود می‌توانند جای دهند اشاره دارند. برای مقداردهی هر آرایه هم باید ابتدا اندیس آرایه و سپس اندیس عناصر آن را بنویسیم. مثلاً مقداردهی اولین عنصر اولین آرایه مثال بالا به صورت زیر عمل می‌کنیم :

myArrays[0][0] = 1;

و برای مثلاً دومین عنصر دومین آرایه هم به صورت زیر :

myArrays[1][1] = 4;

شکل زیر هم اندیس عناصر آرایه‌ای که در بالا تعریف کرده‌ایم را نشان می‌دهد:
jagged-array-1001
با توجه به توضیحاتی که داده شد می‌توان عناصر آرایه‌ای که در ابتدای درس ایجاد کردیم را به صورت زیر مقداردهی کرد :

myArrays[0][0] = 1;
myArrays[0][1] = 2;
myArrays[0][2] = 3;

myArrays[1][0] = 5;
myArrays[1][1] = 4;
myArrays[1][2] = 3;
myArrays[1][3] = 2;
myArrays[1][4] = 1;

myArrays[2][0] =11;
myArrays[2][1] =22;

یک روش بهتر برای مقدار دهی آرایه‌های دندانه دار به صورت زیر است که در آن می‌توان طول سطرها را هم مشخص نکرد :

int[][] myArrays = {{1,2,3}, {5,4,3,2,1}, {11,22}};

برای دسترسی به مقدار عناصر یک آرایه دندانه دار باید اندیس سطر و ستون آن را در اختیار داشته باشیم :

array[row][column]
System.out.println(myArrays[1][2]);

نمی‌توان از حلقه foreach برای دسترسی به عناصر آرایه دندانه دار استفاده کرد :

for(int array : myArrays)
{
    System.out.println(array);
}

اگر از حلقه foreach استفاده کنیم با خطا مواجه می‌شویم چون عناصر این نوع آرایه‌ها، آرایه هستند نه عدد یا رشته یا… . برای حل این مشکل باید نوع متغیر موقتی (array) را تغییر داده و از حلقه foreach دیگری برای دسترسی به مقادیر استفاده کرد.

for(int[] array : myArrays)
{
   for(int number : array)
   {
      System.out.println(number);
   }
}

همچنین می‌توان از یک حلقه for تو در تو به صورت زیر استفاده کرد :

for (int row = 0; row < myArrays.length; row++)
{
   for (int col = 0; col < myArrays[row].length; col++)
   {
      System.out.println(myArrays[row][col]);
   }
}

در اولین حلقه از length برای به دست آوردن تعداد سطرها (که همان آرایه‌های یک بعدی هستند) و در دومین حلقه از length برای به دست آوردن عناصر سطر جاری استفاده می‌شود.