المصفوفات والقوائم في Kotlin: Array و List و Map
قائمة جهات الاتصال، والأغاني في تطبيق الموسيقى، ودرجات الطلاب: كلها مجموعات من البيانات. في Kotlin هناك عدة أنواع للمجموعات، ولكل نوع استخدامه. في هذا الدرس ستتعرف على المصفوفات، ثم على القوائم التي ستستخدمها أكثر بكثير، ثم على الخرائط.
المصفوفة Array
Section titled “المصفوفة Array”مجموعة عناصر بحجم ثابت، كل عنصر له رقم يبدأ من صفر:
val numbers = arrayOf(10, 20, 30)println(numbers[0])println(numbers.size)numbers[1] = 25println(numbers.joinToString())10310, 25, 30arrayOf(...): تنشئ المصفوفة.numbers[0]: أول عنصر، وsizeعدد العناصر.- يمكن تعديل قيمة عنصر، لكن لا يمكن إضافة عناصر جديدة أو حذفها، فالحجم ثابت.
تخيّل المصفوفة مثل صندوق بيض: فيه أماكن محددة العدد، تستطيع تبديل بيضة بأخرى، لكن لا تستطيع إضافة مكان جديد.
القائمة List
Section titled “القائمة List”في الواقع، ستستخدم القوائم أكثر من المصفوفات بكثير. و Kotlin تفرّق بين نوعين:
القائمة الثابتة List: للقراءة فقط، لا تُضاف إليها عناصر ولا تُحذف:
val colors = listOf("أحمر", "أخضر", "أزرق")println(colors)println(colors.first())println(colors.last())println(colors.contains("أزرق"))[أحمر, أخضر, أزرق]أحمرأزرقtrueالقائمة القابلة للتعديل MutableList:
val tasks = mutableListOf("مذاكرة", "رياضة")tasks.add("قراءة")tasks.remove("رياضة")tasks[0] = "مذاكرة Kotlin"println(tasks)println(tasks.size)[مذاكرة Kotlin, قراءة]2لاحظ أن tasks معرّفة بـ val، ومع ذلك أضفنا إليها وحذفنا منها! لأن val تعني أن المتغير لا يشير إلى قائمة أخرى، لكن محتوى القائمة القابلة للتعديل نفسه يمكن أن يتغير.
لماذا نوعان؟ القائمة الثابتة تحميك من التعديل بالخطأ. إذا مررت قائمة لدالة، وكانت List، فأنت متأكد أن الدالة لن تغيّرها. القاعدة: ابدأ بـ listOf، واستخدم mutableListOf فقط عندما تحتاج التعديل.
دوال القوائم القوية
Section titled “دوال القوائم القوية”val scores = listOf(85, 92, 78, 64)println(scores.filter { it >= 75 })println(scores.map { it + 5 })println(scores.sum())println(scores.average())println(scores.max())println(scores.sorted())println(scores.sortedDescending())[85, 92, 78][90, 97, 83, 69]31979.7592[64, 78, 85, 92][92, 85, 78, 64]filter: يحتفظ بالعناصر التي تحقق الشرط.map: يحوّل كل عنصر إلى قيمة جديدة.sumوaverageوmax: المجموع والمتوسط وأكبر قيمة.sortedوsortedDescending: ترتيب تصاعدي وتنازلي، وتُرجعان قائمة جديدة دون تغيير الأصلية.
بهذه الدوال تكتب في سطر واحد ما يحتاج حلقة كاملة في لغات أخرى.
الخريطة Map
Section titled “الخريطة Map”مجموعة أزواج مفتاح ← قيمة، مثل القاموس:
val prices = mapOf("قلم" to 5, "كراسة" to 15, "مسطرة" to 7)println(prices["قلم"])println(prices["ممحاة"])for ((item, price) in prices) { println("$item: $price جنيه")}println(prices.values.sum())5nullقلم: 5 جنيهكراسة: 15 جنيهمسطرة: 7 جنيه27"قلم" to 5: تربط المفتاح بقيمته.- طلب مفتاح غير موجود مثل
"ممحاة"يُرجعnull، فنوع القيمة المقروءة يقبل null. for ((item, price) in prices)تفكك كل زوج إلى مفتاح وقيمة.
وللخريطة نسخة قابلة للتعديل أيضاً:
val stock = mutableMapOf("تفاح" to 10)stock["موز"] = 5stock["تفاح"] = 8println(stock){تفاح=8, موز=5}جرّب بنفسك
Section titled “جرّب بنفسك”احسب عدد مرات تكرار كل كلمة في قائمة:
fun main() { val words = listOf("تفاح", "موز", "تفاح", "عنب", "موز", "تفاح") val counts = mutableMapOf<String, Int>() for (w in words) { counts[w] = (counts[w] ?: 0) + 1 } println(counts)}{تفاح=3, موز=2, عنب=1}لاحظ counts[w] ?: 0: في أول مرة تظهر الكلمة قيمتها null، فنبدأ من صفر باستخدام معامل إلفيس.
تحدٍّ: من قائمة درجات، اطبع عدد الناجحين (75 فأكثر) ومتوسط درجاتهم فقط.
أخطاء شائعة
Section titled “أخطاء شائعة”- رقم خارج حدود القائمة:
colors[5]في قائمة من 3 عناصر تسبب خطأArrayIndexOutOfBoundsException. آخر رقم هوsize - 1. - محاولة add على List:
listOfلا تقبل الإضافة. استخدمmutableListOf. - طباعة المصفوفة مباشرة: تطبع عنوانها في الذاكرة. استخدم
joinToString().
اختبر نفسك
Section titled “اختبر نفسك”سؤال
أي دالة تنشئ قائمة يمكن الإضافة إليها والحذف منها؟
listOf للقراءة فقط، و arrayOf حجمها ثابت، أما mutableListOf فتقبل الإضافة والحذف.
سؤال
ما ناتج listOf(3, 8, 5).filter { it > 4 }؟
filter يحتفظ فقط بالعناصر التي تحقق الشرط، وهما 8 و 5.
الخلاصة
Section titled “الخلاصة”arrayOfمصفوفة بحجم ثابت، واطبعها بـjoinToString().listOfقائمة للقراءة فقط، وmutableListOfقابلة للتعديل، وابدأ دائماً بالثابتة.filterوmapوsumوaverageوsortedتختصر الحلقات الطويلة.mapOf("مفتاح" to قيمة)للخرائط، وقراءة مفتاح غير موجود تُرجع null.- الترقيم يبدأ من صفر، وآخر عنصر رقمه
size - 1.