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

آرایه دندانه دار یا 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];

jagged-array-1001
ابتدا با استفاده از کلمه کلیدی new سطرهای آرایه را مشخص می‌کنیم. بعد از کلمه کلیدی new نوع آرایه و سپس در اولین کروشه باز و بسته تعداد سطرها را می‌نویسیم. سپس تعداد ستون‌های هر سطر را با استفاده از اندیس هر سطر به صورت بالا مشخص می‌کنیم. سپس بعد از تعریف ستون‌ها به صورت زیر می‌توان با استفاده از آکولاد مقادیر هر سطر را مشخص کرد :

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

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

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

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

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

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

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

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

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

array[row][column]
Console.WriteLine(myArrays[1][2]);

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

foreach(int array in myArrays)
{
    Console.WriteLine(array);
}

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

foreach(int[] array in myArrays)
{
   foreach(int number in array)
   {
      Console.WriteLine(number);
   }
}

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

for (int row = 0; row < myArrays.Length; row++)
{
   for (int col = 0; col < myArrays[row].Length; col++)
   {
      Console.WriteLine(myArrays[row][col]);
   }
}

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

لطفا اگر نظر، پیشنهاد و یا انتقادی در باره مطلب بالا دارید در قسمت زیر و اگر سوالی دارید در بخش پرسش و پاسخ مطرح بفرمایید.

  1. fbabaeian پاسخ دادن

    سلام
    من از این روش

    for (int row = 0; row < myArrays.Length; row++)
    {
       for (int col = 0; col < myArrays[row].Length; col++)
       {
          Console.WriteLine(myArrays[row][col]);
       }
    }
    

    استفاده کردم و خطا گرفتم شما اینو تست کردین؟

    • یونس ابراهیمی پاسخ دادن

      سلام، بله بنده همه کدها رو تست شده گذاشتم تو سایت. شما احتمالا آرایه رو ننوشتین و با خطا مواجه شدین. کد رو باید به صورت زیر بنیوسین

      int[][] myArrays = {
                              new int[] { 1, 2, 3 },
                              new int[] { 5, 4, 3, 2, 1 },
                              new int[] { 11, 22 }
                          };
      
      for (int row = 0; row < myArrays.Length; row++)
      {
          for (int col = 0; col < myArrays[row].Length; col++)
          {
              Console.WriteLine(myArrays[row][col]);
          }
      }
      
  2. fbabaeian پاسخ دادن

    آرایه رو تعریف کرده بودم اما بدون درج مقدار
    در حقیقت از این روش برای تمرین درس قبل که کارنامه دانش آموزان بود خواستم استفاده کنم ولی نتونستم شما می تونید راهنماییم کنید؟

    • یونس ابراهیمی پاسخ دادن

      ممنون میشم از این به بعد سوالاتتونو تو بخش پرسش و پاس سایت مطرح بفرمایید

      using System;
      
      namespace ConsoleApp6
      {
          class Program
          {
              static void Main(string[] args)
              {
                  double total;
      
                  Console.Write("Enter number of students : ");
                  int Rows = Convert.ToInt32(Console.ReadLine());
                  double[][] studentGrades = new double[Rows][];
                  Console.WriteLine("\n");
                  for (int i = 0; i < studentGrades.Length; i++)
                  {
                      Console.Write("Enter number of student" + (i + 1) + " books: ");
                      studentGrades[i] = new double[Convert.ToInt32(Console.ReadLine())];
                  }
                  Console.WriteLine("\n");
      
      
                  for (int i = 0; i < studentGrades.Length; i++)
                  {
                      total = 0;
                      for (int j = 0; j < studentGrades[i].Length; j++)
                      {
                          Console.Write("Enter grades for Student" + (i + 1) + " Book" + (j + 1) + " : ");
                          studentGrades[i][j] = Convert.ToInt32(Console.ReadLine());
                          total += studentGrades[i][j];
                      }
                      Console.WriteLine("Average is {0:F2}", (total / studentGrades[i].Length));
                      Console.WriteLine();
                  } 
                  Console.ReadLine();
              }
          }
      }
      
  3. fbabaeian پاسخ دادن

    ممنونم از شما چشم