آرایه های چند بعدی

آرایه‌های چند بعدی، آرایه‌هایی هستند که برای دسترسی به هر یک از عناصر آنها باید از چندین اندیس استفاده کنیم. یک آرایه چند بعدی را می‌توان مانند یک جدول با تعدادی ستون و سطر تصور کنید. با افزایش اندیسها اندازه ابعاد آرایه نیز افزایش می‌یابد و آرایه‌های چند بعدی با بیش از دو اندیس به وجود می‌آیند. نحوه ایجاد یک آرایه با دو بعد به صورت زیر است :

var arrayName = [[typeArray]]()

همانطور که قبلا گفتیم، وجود کروشه به معنای آرایه است. در کد بالا، [[typeArray]] به معنای آرایه ای از آرایه ها است. کد بالا را به صورت زیر هم می‌توان نوشت:

var arrayName :[[typeArray]] = [[array1], [array2]]

روش دیگر برای ایجاد آرایه دو بعدی به صورت زیر است:

var arrayName :[[typeArray]] = Array(repeating: Array(repeating: value that fill array, count:column), count:row)

می‌توان یک آرایه با تعداد زیادی بعد، ایجاد کرد به شرطی که، هر بعد دارای طول مشخصی باشد. در یک آرایه دو بعدی برای دسترسی به هر یک از عناصر به دو مقدار نیاز داریم یکی اندیس سطر (row) و دیگری اندیس ستونی (column) است که آن عنصر درآن قرار دارد. البته اگر ما آرایه دو بعدی را به صورت جدول در نظر بگیریم. در شکل زیر مکان هر عنصر در یک آرایه دو بعدی نشان داده شده است.

مقدار 3 را به row، چون 3 سطر یا آرایه داریم و مقدار 5 را به column چون هر آرایه 5 ستون دارد، اختصاص می‌دهیم. چطور یک آرایه چند بعدی را مقدار دهی کنیم؟ می خواهیم به سه روش بالا یک آرایه تعریف کنیم که دارای 4 ستون و 2 سطر باشد. به روش اول توجه کنید:

 1: var numbers = [[Int]]()
 2: 
 3: var row1 = [Int]()
 4: row1 += [1]
 5: row1 += [2]
 6: row1 += [3]
 7: row1 += [4]
 8: 
 9: var row2 = [Int]()
10: row2 += [5]
11: row2 += [6]
12: row2 += [7]
13: row2 += [8]
14: 
15: numbers += [row1]
16: numbers += [row2]

در روش بالا و خط 1، ما یک آرایه دو بعدی تعریف کرده ایم. سپس در خطوط 7-3 و 12-9 دو آرایه به نام های row1 و row2 ایجاد و آنها را در خطوط 15 و 16 به آرایه دو بعدی مان اضافه نموده ایم.

var numbers :[[Int]] = [[1, 2, 3, 4], [5, 6, 7, 8]]

روش سوم

var numbers:[[Int]] = Array(repeating: Array(repeating: 0, count:4), count:2)

numbers[0][0] = 1
numbers[0][1] = 2
numbers[0][2] = 3
numbers[0][3] = 4

numbers[1][0] = 5
numbers[1][1] = 6
numbers[1][2] = 7
numbers[1][3] = 8

در روش سوم که از کلاس Array استفاده کرده‌ایم باید مقدار دهی به عناصر را به صورت دستی انجام داد. همانطور که مشاهده می‌کنید برای دسترسی به هر یک از عناصر در یک آرایه دو بعدی به سادگی می‌توان از اندیسهای row و column و یک جفت کروشه مانند مثال استفاده کرد.

گردش در میان عناصر آرایه‌های چند بعدی

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

 1: var numbers :[[Int]] = [
 2:                             [ 1,  2,  3,  4, 5 ], 
 3:                             [ 6,  7,  8,  9, 10],
 4:                             [11, 12, 13, 14, 15] 
 5:                        ]                         
 6: 
 7: for row in 0..<numbers.count
 8: {
 9:     for column in 0..<numbers[row].count
10:     {
11:         print(numbers[row][column], terminator:" ")
12:     }
13:     print()
14: }
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15

همانطور که در مثال بالا نشان داده شده است با استفاده از یک حلقه ساده for نمی‌توان به مقادیر دسترسی یافت بلکه به یک حلقه for تو در تو نیاز داریم. به زبان ساده در کد بالا دو حلقه for داریم. یکی برای به دست آوردن تعداد آرایه‌ها و دیگری برای به دست آوردن ستون یا تعداد عناصر آرایه‌ها. در اولین حلقه for، با استفاده از خاصیت count، اندیس آرایه‌های موجود در آرایه numbers که در اصل همان تعداد آرایه‌ها می‌باشد را به دست می‌آوریم. این خط را می‌توان به صورت زیر هم نوشت :

for(row in 0...2)

چرا 2..0؟ چون اندیس آرایه‌ها هم از صفر شروع می‌شود. یعنی اندیس اولین آرایه دارای اندیس 0 و … . در حلقه for دوم با استفاده از خاصیت count، تعداد ستون‌های یک آرایه را به دست می‌آوریم. و چون تعداد عناصر یا ستون‌های همه آرایه‌ها برابر 5 است پس عبارت numbers[row].count عدد 5 را بر می‌گرداند. در نتیجه خط 11 را می‌توان به صورت زیر هم نوشت :

for column in 0..<5

در مجموع می‌توان گفت که row اعداد 0، 1 و 2 را در خود جای می‌دهد و column هم اعداد 0، 1، 2، 3 و 4. در نتیجه وقتی که مقدار ردیف (row) 0 باشد، حلقه دوم از [0][0] تا [4][0] اجرا شود. سپس مقدار هر عنصر از آرایه را با استفاده از حلقه نشان می‌دهیم، اگر مقدار ردیف (row) برابر 0 و مقدار ستون (column) برابر 0 باشد، مقدار عنصری که در ستون 1 و ردیف 1 (numbers[0][0]) قرار دارد نشان داده خواهد شد که در مثال بالا، عدد 1 است.

بعد از اینکه دومین حلقه تکرار به پایان رسید، فوراً دستورات بعد از آن اجرا خواهند شد، که در اینجا دستور print() که به برنامه اطلاع می‌دهد که به خط بعد برود (خط 17). سپس حلقه با اضافه کردن یک واحد به مقدار row این فرایند را دوباره تکرار می‌کند. سپس دومین حلقه for اجرا شده و مقادیر دومین ردیف نمایش داده می‌شود. حال بیایید آنچه را از قبل یاد گرفته‌ایم در یک برنامه به کار بریم. این برنامه نمره چهار درس مربوط به سه دانش آموز را از ما می‌گیرد و معدل سه دانش آموز را حساب می‌کند.

 1: var studentGrades :[[Double?]] = Array(repeating: Array(repeating: 0, count:4), count:3)
 2: var total: Double
 3: 
 4: for student in 0..<studentGrades.count
 5: {
 6:     total = 0.0
 7:     
 8:     print("Enter grades for Student \(student+1)")
 9: 
10:     for grade in 0..<studentGrades[student].count
11:     {
12:         print("Enter Grade #\(grade): ", terminator:"")
13:         studentGrades[student][grade] = Double(readLine()!)
14:         total += studentGrades[student][grade]!
15:     }
16: 
17:     print("Average is ", total / Double(studentGrades[student].count))
18:     print()
19: }
Enter grades for Student 1
Enter Grade #1: 92
Enter Grade #2: 87
Enter Grade #3: 89
Enter Grade #4: 95
Average is 90.75

Enter grades for Student 2
Enter Grade #1: 85
Enter Grade #2: 85
Enter Grade #3: 86
Enter Grade #4: 87
Average is 85.75

Enter grades for Student 3
Enter Grade #1: 90
Enter Grade #2: 90
Enter Grade #3: 90
Enter Grade #4: 90
Average is 90.00

در برنامه بالا یک آرایه دو بعدی از نوع Double تعریف شده است (خط 1). این آرایه 3 آرایه دارد و هر آرایه 4 عنصر. در کل 3 دانش آموز و هر دانش آموز 4 درس. همچنین یک متغیر به نام total تعریف می‌کنیم که مقدار محاسبه شده معدل هر دانش آموز را در آن قرار دهیم (خط 2). حال وارد حلقه for تو در تو می‌شویم (خط 4). در اولین حلقه for تعداد دانش آموزان را با استفاده از خاصیت count به دست می‌آوریم. در نتیجه متغیر student اعداد 0، 1 و 2 را در خود ذخیره می‌کند. وارد بدنه حلقه for می‌شویم. در خط 6 مقدار متغیر total را برابر صفر قرار می‌دهیم. بعداً مشاهده می‌کنید که چرا این کار را انجام دادیم. سپس برنامه یک پیغام را نشان می‌دهد و از شما می‌خواهد که شماره دانش آموز را وارد کنید (student + 1). عدد 1 را به student اضافه کرده‌ایم تا به جای نمایش student 0، با student 1 شروع شود، تا طبیعی‌تر به نظر برسد.

سپس به دومین حلقه for در خط 10 می‌رسیم. در این حلقه یک متغیر شمارنده به نام grade تعریف می‌کنیم و تعداد عناصر آرایه را با استفاده از studentGrades[student].count را در آن قرار می‌دهیم. این متغیر اعداد 0، 1، 2 و 3 را در خود جای می‌دهد. برنامه چهار نمره مربوط به دانش آموز را می‌گیرد. هر وقت که برنامه یک نمره را از کاربر دریافت می‌کند، نمره به متغیر total اضافه می‌شود. وقتی همه نمره‌ها وارد شدند، متغیر total هم جمع همه نمرات را نشان می‌دهد. در خط 17 معدل دانش آموز نشان داده می‌شود. معدل از تقسیم کردن total (جمع) بر تعداد نمرات به دست می‌آید.