تعریف آرایه
از آرایه برای نگهداشتن تعداد متناهی از متغیر های هم نوع استفاده میکنیم. که بهشون عنصر (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 یک تابع مرتبه بالاست.
- برای تعریف توابع چند بعدی کافیه اعضای آرایه خود یک آرایه باشن