آرایه ها
آرایه، نوعی متغیر است که، لیستی از آدرسهای، مجموعهای از دادههای هم نوع را، در خود ذخیره میکند. تعریف چندین متغیر از یک نوع، برای هدفی یکسان، بسیار خسته کننده است. مثلاً اگر بخواهید صد متغیر از نوع اعداد صحیح تعریف کرده و از آنها استفاده کنید. مطمئناً تعریف این همه متغیر بسیار کسالت آور و خسته کننده است. اما با استفاده از آرایه میتوان همه آنها را در یک خط تعریف کرد. در زیر راهی ساده برای تعریف یک آرایه نشان داده شده است :
val arrayName = datatypeArray(length)
arrayName که نام آرایه را نشان میدهد. هنگام نامگذاری آرایه بهتر است که نام آرایه نشان دهنده نوع آرایه باشد. به عنوان مثال برای نامگذاری آرایهای که اعداد را در خود ذخیره میکند از کلمه number استفاده کنید. بعد از علامت مساوی، کلاسهای در کاتلین وجود دارند که نام آنها نشان دهنده نوع آرایهای است که قرار است ایجاد کنیم. مثلاً برای ایجاد یک آرایه از نوع اعداد صحیح یا Int کلاسی با نام IntArray وجود دارد که در داخل سازنده آن طول (length) آرایه را مینویسیم. طول آرایه که به کامپایلر میگوید شما قصد دارید چه تعداد داده یا مقدار را در آرایه ذخیره کنید. حال برای تعریف یک آرایه که 5 مقدار از نوع اعداد صحیح در خود ذخیره میکند باید به صورت زیر عمل کنیم :
val numbers = IntArray(5)
در این مثال 5 آدرس از فضای حافظه کامپیوتر شما برای ذخیره 5 مقدار رزرو میشود. حال چطور مقادیرمان را در هر یک از این آدرسها ذخیره کنیم؟ برای دسترسی و اصلاح مقادیر آرایه از اندیس یا مکان آنها استفاده میشود.
numbers[0] = 1 numbers[1] = 2 numbers[2] = 3 numbers[3] = 4 numbers[4] = 5
اندیس یک آرایه از صفر شروع شده و به یک واحد کمتر از طول آرایه ختم میشود. به عنوان مثال شما یک آرایه 5 عضوی دارید، اندیس آرایه از 0 تا 4 میباشد چون طول آرایه 5 است، پس 1-5 برابر است با 4. این بدان معناست که اندیس 0 نشان دهنده اولین عضو آرایه است و اندیس 1 نشان دهنده دومین عضو و الی آخر. برای درک بهتر مثال بالا به شکل زیر توجه کنید :
به هر یک از اجزاء آرایه و اندیسهای داخل کروشه توجه کنید. کسانی که تازه شروع به برنامه نویسی کردهاند معمولاً در گذاشتن اندیس دچار اشتباه میشوند و مثلاً ممکن است در مثال بالا اندیسها را از 1 شروع کنند. اگر بخواهید به یکی از اجزائ آرایه با استفاده از اندیسی دسترسی پیدا کنید که در محدوده اندیسهای آرایه شما نباشد با پیغام خطای ArrayIndexOutOfBoundsException مواجه میشوید و بدین معنی است که شما آدرسی را میخواهید که وجود ندارد. کلاسهای دیگری برای تعریف انواع مختلف آرایه وجود دارند که در زیر به آنها اشاره شده است:
- FloatArray
- StringArray
- DoubleArray
- CharArray
- ByteArray
- LongArray
- ShortArray
کلاسهای بالا، فقط حافظه را رزرو میکنند و شما باید به روشی که در ابتدای درس اشاره شد و با استفاده از اندیس، مقدار عناصر را مشخص کنید. یک راه بسیار سادهتر برای تعریف آرایه به صورت زیر است :
val numbers = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
به سادگی و بدون احتیاج به اندیس میتوان مقادیر را در داخل پرانتز قرار داد. کامپایلر به صورت اتوماتیک با شمارش مقادیر طول آرایه را تشخیص میدهد و به ترتیب از 0، به هر کدام از عناصر داخل آرایه یک اندیس اختصاص میدهد. مثلاً اندیس عدد 5 در کد بالا 4 است. به اسم متد ()intArrayOf توجه کنید. متدهای دیگری با همین ساختار وجود دارند، که با استفاده از آنها میتوان فوراً آرایه را مقدار دهی کرد. در زیر لیست این متدها آمده است:
- floatArrayOf
- stringArrayOf
- doubleArrayOf
- charArrayOf
- byteArrayOf
- longArrayOf
- shortArrayOf
دستیابی به مقادیر آرایه با استفاده از حلقه for
در زیر مثالی در مورد استفاده از آرایهها آمده است. در این برنامه 5 مقدار از کاربر گرفته شده و میانگین آنها حساب میشود:
1: fun main(args: Array<String>) 2: { 3: val numbers = IntArray(5) 4: var total = 0 5: val average: Double 6: 7: for (i in numbers.indices) 8: { 9: print("Enter a number: ") 10: numbers[i] = readLine()!!.toInt() 11: } 12: for (i in numbers.indices) 13: { 14: total += numbers[i] 15: } 16: 17: average = total / numbers.size.toDouble() 18: 19: println("Average = $average") 20: }
Enter a number: 90 Enter a number: 85 Enter a number: 80 Enter a number: 87 Enter a number: 92 Average = 86
در خط 3 یک آرایه تعریف شده است که میتواند 5 عدد صحیح را در خود ذخیره کند. خطوط 4 و 5 متغیرهایی تعریف شدهاند که از آنها برای محاسبه میانگین استفاده میشود. توجه کنید که مقدار اولیه total صفر است تا از بروز خطا هنگام اضافه شدن مقدار به آن جلوگیری شود. در خطوط 7 تا 11 حلقه for برای تکرار و گرفتن ورودی از کاربر تعریف شده است. از خاصیت indices آرایه برای تشخیص تعداد اجزای آرایه استفاده میشود. اگر چه میتوانستیم به سادگی در حلقه for مقدار 5 را برای شرط قرار دهیم ولی استفاده از خاصیت indices، کار راحتتری است و میتوانیم طول آرایه را تغییر دهیم و شرط حلقه for با تغییر جدید هماهنگ میشود. در خط 10 ورودی دریافت شده از کاربر با استفاده از متد ()readLine دریافت و سپس به نوع صحیح تبدیل و در آرایه ذخیره میشود. اندیس استفاده شده در number (خط 10) مقدار i جاری در حلقه است. برای مثال در ابتدای حلقه مقدار i، عدد 0 است. بنابراین وقتی در خط 10 اولین داده از کاربر گرفته میشود، اندیس آن برابر 0 میشود. در تکرار بعدی i یک واحد اضافه میشود و در نتیجه در خط 10 و بعد از ورود دومین داده توسط کاربر اندیس آن برابر 1 میشود. این حالت تا زمانی که شرط در حلقه for برقرار است ادامه مییابد. در خطوط 15-12 از حلقه for دیگر برای دسترسی به مقدار هر یک از دادههای آرایه استفاده شده است. در این حلقه نیز مانند حلقه قبل از مقدار متغیر شمارنده به عنوان اندیس استفاده میکنیم.
هر یک از اجزای عددی آرایه به متغیر total اضافه میشوند. بعد از پایان حلقه میتوانیم میانگین اعداد را حساب کنیم (خط 17). مقدار total را بر تعداد اجزای آرایه (تعداد عددها) تقسیم میکنیم. برای دسترسی به تعداد اجزای آرایه میتوان از خاصیت size آرایه استفاده کرد. توجه کنید که در اینجا ما مقدار خاصیت size را به نوع Double تبدیل کردهایم. بنابراین نتیجه عبارت یک مقدار از نوع Double خواهد شد و دارای بخش کسری میباشد. حال اگر عملوندهای تقسیم را به نوع Double تبدیل نکنیم نتیجه تقسیم یک عدد از نوع صحیح خواهد شد و دارای بخش کسری نیست. خط 19 مقدار میانگین را در صفحه نمایش چاپ میکند. طول آرایه بعد از مقدار دهی نمیتواند تغییر کند. به عنوان مثال اگر یک آرایه را که شامل 5 جز است مقداردهی کنید، دیگر نمیتوانید آن را مثلاً به 10 جز تغییر اندازه دهید. البته تعداد خاصی از کلاسها مانند آرایهها عمل میکنند و توانایی تغییر تعداد اجزای تشکیل دهنده خود را دارند. آرایهها در برخی شرایط بسیار پر کاربرد هستند و تسلط شما بر این مفهوم و اینکه چطور از آنها استفاده کنید بسیار مهم است.