آرایه (Array) ها در کاتلین

آرایه ها در کاتلین

تعریف آرایه

از آرایه برای نگهداشتن تعداد متناهی از متغیر های هم نوع استفاده میکنیم. که بهشون عنصر (element) یا عضو میگیم.

فرض کنید داخل برنامه به 7 تا متغیر از نوع یکسان احتیاج دارید؛ باید مثل زیر برای هر مقدار یک متغیر تعریف کنید:

var v0 = 5 var v1 = 2 var v2 = 8 var v3 = 0 var v4 = 9 var v5 = 1 var v6 = 3

این کار ممکنه وقت گیر باشه و کد های برنامه رو زیاد کنه؛ مخصوصا زمانی که تعداد متغیر ها بالاست.

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

var myArray = arrayOf<Int>(5, 2, 8, 0, 9, 1, 3)

همینطور که می بینید دیگه نیاز به تعریف 7 تا متغیر نداریم بلکه هر 7 متغیر رو داخل متغیری به اسم آرایه قرار دادیم، اصطلاحا میگیم یک آرایه به طول 7 ایجاد کردیم.

وقتی میگیم آرایه به طول n؛ شما n تا خونه کنار همو درنظر بگیرید که هر خونه میزبان یک متغیر است. به متغیر های آرایه عناصر آرایه میگیم.
در زیر ساختار یک آرایه به طول 7 رو به تصویر کشیدیم:

ساختار یک آرایه

جایگاه هر عنصر ثابته مثلا وقتی عدد 1 رو به خونه ی شماره 5 اختصاص دادیم تا وقتی مقدار خونه شماره 5 رو تغییر نداده باشیم این خونه میزبان مقدار 1 است.

طول یک ارایه عموما ثابت و تغییر ناپذیره یعنی وقتی یک آرایه به طول n ایجاد میکنیم n تا خونه ایجاد میشه و تعداد خونه ها نه میتونن کم بشن و نه زیاد.
طول یک آرایه در کاتلین رو با size بدست میاریم:

val n = myArray.size println(n)

با اینکه طول یک آرایه ثابته اما متغیر های هر خونه میتونن تغییر کنن:

myArray[5] = 32 println(myArray[5])

روش های ایجاد آرایه در کاتلین

به یک آرایه، آرایه یک بعدی گفته میشه.

ارایه ها در کاتلین رو به دو روش کلی میشه ایجاد کرد:

۱- با استفاده از توابع arrayOf، arrayOfNulls و emptyArray

۲- با ایجاد آبجکت از کلاس Array

ایجاد آرایه با تابع arrayOf

پارامتر تابع arrayOf در کاتلین از نوع vararg است.

تابعو صدا میزنیم و متغیر ها رو به صورت پارامتر به داخل تابع پاس میدیم. طول آرایه برابر میشه با تعداد عناصر های پارامتر.

فرم کلی:

val arr = arrayOf<T>(t0, t1, ..., tn)

در بالا t0 تا tn متغیر هایی از جنس T هستند که به تابع پاس داده شدن.

مثال

در زیر یک آرایه از نوع String با طول 4 ایجاد کردیم.

val names = arrayOf<String>("James", "Tom", "Joy", "Issuable") println(names.joinToString())

ایجاد آرایه با تابع arrayOfNulls

تابع arrayOfNulls در کاتلین یک آرایه به طول n و با عناصر null ایجاد میکنه.

مقدار طول آرایه رو به صورت پارامتر به تابع پاس میدیم.

فرم کلی

val arr = arrayOfNulls<T>(n)

در بالا n یک عدد از نوع Int است که طول ارایه رو مشخص میکنه.

مثال

در زیر یک آرایه به طول 100 و از نوع Double با عناصر null ایجاد کردیم:

val v = arrayOfNulls<Double>(100)

ایجاد آرایه با استفاده از تابع emptyArray

با استفاده از این تابع یک آرایه با طول 0 ایجاد میکنیم.

توجه:

با استفاده از += میشه یک آرایه جدید از قبلی با طول بیشتر ایجاد کرد، در مجموع این کار بیهوده است. چون Collection ها برای حذف و اضافه ی عناصر وجود دارن.

مثال

یک آرایه String به طول 0 تعریف میکنیم و با افزودن یک مقدار به آرایه طولش 1 میشه:

val lastNames = emptyArray<String>() println("Before adding value(s) length is ${lastNames.size}") arr += "Smith" println("After adding value(s) length is ${lastNames.size}")

ایجاد آرایه با استفاده از کلاس Array

در این روش با ایجاد یک نمونه (آبجکت) از کلاس Array در کاتلین میتونیم یک آرایه ایجاد کنیم.

فرم کلی

val arr = Array<T>(n){ index -> t }

در بالا تابع constructor کلاس Array تابع مرتبه ی بالا است. n طول آرایه از نوع Int است، T نوع متغیر های آرایه، index شماره ی هر خونه که نوعش Int و t مقدار اختصاص داده شده به خونه ی شماره ی index است.

مثال

یک آرایه به طول 20 ایجاد میکنیم که در صورت زوج بودن شماره خونه ی آرایه مقدار زوج و در صورت فرد بودنش مقدار فرد رو به صورت String بهش اختصاص بده.

val evenOrOdd = Array(20){ index -> var result = "" if(index % 2 == 0) result = "Even" else result = "Odd" result }

مثال

یک آرایه به طول 30 تعریف میکنیم و اگه شماره ی هر خونه عدد اول بود مقدار اون شماره رو به خونه ی مورد نظر اختصاص میدیم و بقیه رو 0 میزاریم.

val primeIndices = Array<Int>(30){ index -> var isPrime = true for( i in 0 until index/2 ){ if( index % i == 0) isPrime = false } val result = if(isPrime) index else 0 result } println(primeIndices.joinToString())

صدا زدن عناصر داخل آرایه

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

برای صدا زدن متغیر های داخل آرایه مانند زیر عمل میکنیم:

val names = arrayOf("Peter", "Fredrick", "Kyle", "Simon") val name = names[2] println("Index is 2 name is $name")

توابع رایج در آرایه

تابع isEmpty

این تابع معلوم میکنه یک آرایه خالی است یا خیر.

val arr = emptyArray<String>() println(arr.isEmpty())

تابع shuffle

این تابع جایگاه عناصر داخل آرایه رو با همدیگه عوض میکنه اصطلاحا عناصر داخل آرایه رو قاطی پاتی میکنه.

مثال

val numbers = arrayOf(1, 2, 3, 4, 5, 6, 7) println("Before shuffling: ${numbers.joinToString()}") numbers.shuffle() println("After shuffling: ${numbers.joinToString()}")

تابع contentEquals

تایع contentEquals در کاتلین یک تابع infix است.

اگه تمام اعضای دو آرایه باهم یکسان باشن مقدار true و اگه یکسان نباشن false رو بر میگردونه.

مثال

val arr0 = arrayOf("a", "b", "c") val arr1 = arrayOf("a", "b", "c") println(arr0 contentEquals arr1) arr1 += "z" println(arr0 contentEquals arr1)

توابع toList و toSet

تابع toList برای تبدیل آرایه به List و تابع toSet برای تبدیل آرایه به Set به کار برده میشه.

مثال

val arr = arrayOf("Sophia", "Billy", "Jonathan") val list: List<String> = arr.toList()

آرایه های دو بعدی

عناصر یک آرایه خود میتونن آرایه باشن.

خود آرایه متغیر است بنابراین میتونیم یک یا چند آرایه رو داخل یک آرایه قرار بدیم.

مثال

val row0 = arrayOf<String>("a", "b", "c") val row1 = arrayOf<String>("x", "y", "z") val twoD = arrayOf(abc, xyz) for(row in twoD.indices){ for(col in twoD[row].indices){ val cell = twoD[row][col] print("$cell ") } println() }

مثال

چاپ فاصله ی بین پنج شهر اراک، قم، همدان، تهران و شیراز به صورت دو بعدی.

//Qom, Hamedan, Tehran, Shiraz val arak = arrayOf<Int>(132, 191, 282, 681) //Arak, Hamedan, Tehran, Shiraz val qom = arrayOf<Int>(132, 298, 149, 705) //Arak, Qom, Tehran, Shiraz val hamedan = arrayOf<Int>(191, 298, 318, 881) //Arak, Qom, Hamedan, Shiraz val tehran = arrayOf<Int>(282, 149, 318, 844) //Arak, Qom, Hamedan, Tehran val shiraz = arrayOf<Int>(681, 705, 881, 844) val distances = arrayOf<Array<Int>>(arak, qom, hamedan, tehran, shiraz) val cities = arrayOf("Arak", "Qom", "Hamedan", "Tehran", "Shiraz") for(city in cities){ System.out.printf("%11s", city) } println("\n") //Print Distances for(row in distances.indices){ System.out.printf("%-8s",cities[row]) for(col in distances[row].indices){ val distance = distances[row][col] System.out.printf("%-11d", distance) } println() }

در بالا printf یک متد (تابع) جاواست.

مثال

val matrix = Array<Array<Int>>(4){ arrayOfNulls<Int>(3) } //مقدار دهی آرایه ها for(row in matrix.indices){ for(col in matrix[row].indices){ matrix[row][col] = (0..100).random() } } // نمایش اعضای آرایه for(row in matrix.indices){ for(col in matrix[row].indices){ val cell = matrix[row][col] print("$cell ") } println() }

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

در آرایه دو بعدی اگه عناصر آرایه های داخل آرایه اول نیز یک آرایه باشن آرایه سه بعدی میشه.

مثال

ایجاد و چاپ یک ارایه سه بعدی از اعداد تصادفی در کاتلین.

val threeD = Array(4){ Array(3){ arrayOfNulls<Int>(2) } } for(i in threeD.indices){ for(j in threeD[i].indices){ for(k in threeD[i][j].indices){ threeD[i][j][k] = (0..100).random() } } } for(i in threeD.indices){ for(j in threeD[i].indices){ for(k in threeD[i][j].indices){ val cell = threeD[i][j][k] print("$cell ") } println() } println() }

خلاصه

آرایه ها برای نگهداری تعداد متناهی از متغیر های یک نوع به کار میروند.

به متغیر های داخل آرایه عنصر یا عضو میگیم.

آرایه در کاتلین رو به دو روش میشه ایجاد کرد، با استفاده از توابع یا با استفاده از کلاس آرایه.

با استفاده از توابع arrayOf، arrayOfNulls، emptyArray در کاتلین میتونیم یک آرایه ایجاد کنیم.

تابع constructor کلاس Array یک تابع مرتبه بالاست.

برای تعریف توابع چند بعدی کافیه اعضای آرایه خود یک آرایه باشن

arrow_drop_up
کپی شد!