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

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

val arrayName: arrayOfNulls<datatypeArray>(lenght)

datatypeArray نوع آرایه است و lenght هم طول آرایه یا تعداد آرایه های این آرایه دندانه دار را مشخص می کند. مقداردهی به این آرایه‌ها کمی گیج کننده است. به مثال زیر توجه کنید :

val myArrays = arrayOfNulls<IntArray>(3)

myArrays[0] = IntArray(3)
myArrays[1] = IntArray(5)
myArrays[2] = IntArray(2)

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

myArrays[0]!![0] = 1;

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

myArrays[1]!![1] = 4;

با توجه به توضیحاتی که داده شد می‌توان عناصر آرایه‌ای که در ابتدای درس ایجاد کردیم را به صورت زیر مقداردهی کرد :

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

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

val myArrays = arrayOf(
                         intArrayOf(1, 2, 3), 
                         intArrayOf(5, 4, 3, 2, 1), 
                         intArrayOf(11, 22)
                      )

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

array[row]!![column]
-----------------------------
println(myArrays[1]!![2]);

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

for(int array in myArrays)
{
    println(array);
}

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

for (array in myArrays)
{
    if (array != null) 
    {
        for (number in array) 
        {
            println(number)
        }
    }
}

می توان از کد زیر هم استفاده کرد :

for (row in 0 until myArrays.size)
{
    for (col in 0 until myArrays[row]!!.size)
    {
        println(myArrays[row]!![col])
    }
}

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