القوائم والخرائط في Dart: List و Map و Set
قائمة الرسائل في تطبيق المحادثة، ومنتجات المتجر، وإعدادات المستخدم: كلها مجموعات من البيانات. وفي Flutter، أغلب الشاشات التي ستبنيها تعرض قائمة من شيء ما. في هذا الدرس ستتعلم أهم ثلاثة أنواع للمجموعات في Dart: List و Map و Set.
القائمة List
Section titled “القائمة List”مجموعة مرتبة من العناصر، كل عنصر له رقم (Index) يبدأ من صفر:
var colors = ['أحمر', 'أخضر', 'أزرق'];print(colors[0]);print(colors.length);print(colors.last);أحمر3أزرقتخيّلها مثل قطار: عربات متتالية مرقمة، وكل عربة فيها راكب.
ويمكنك تحديد نوع العناصر: List<int> scores = [85, 92];. والقائمة هنا لا تقبل إلا أرقاماً صحيحة.
تعديل القائمة
Section titled “تعديل القائمة”colors.add('أصفر'); // أضف في النهايةcolors.remove('أخضر'); // احذف عنصراً بقيمتهcolors[0] = 'بنفسجي'; // عدّل العنصر الأولprint(colors);print(colors.contains('أزرق'));print(colors.indexOf('أصفر'));[بنفسجي, أزرق, أصفر]true2دوال أخرى مفيدة: insert(0, x) للإضافة في مكان محدد، و removeAt(i) للحذف بالرقم، و isEmpty و isNotEmpty لفحص الفراغ، و clear() لتفريغ القائمة.
where و map و reduce
Section titled “where و map و reduce”هذه الدوال الثلاث ستستخدمها في كل تطبيق تقريباً:
List<int> scores = [85, 92, 78, 64];
var passed = scores.where((s) => s >= 75).toList();print(passed);
var bonus = scores.map((s) => s + 5).toList();print(bonus);
print(scores.reduce((a, b) => a + b));
scores.sort();print(scores);[85, 92, 78][90, 97, 83, 69]319[64, 78, 85, 92]where: تصفية. احتفظ فقط بالعناصر التي تحقق الشرط، مثل مصفاة القهوة.map: تحويل. طبّق عملية على كل عنصر واحصل على قائمة جديدة.reduce: اختزال. اجمع كل العناصر في قيمة واحدة.sort(): ترتيب تصاعدي، ويعدّل القائمة نفسها.
لاحظ .toList() بعد where و map: هاتان الدالتان تُرجعان نوعاً اسمه Iterable، و toList() تحوله لقائمة عادية.
spread و collection if
Section titled “spread و collection if”var more = [...colors, 'أسود'];print(more);
var isAdmin = true;var menu = ['الرئيسية', 'الكورسات', if (isAdmin) 'لوحة التحكم'];print(menu);[بنفسجي, أزرق, أصفر, أسود][الرئيسية, الكورسات, لوحة التحكم]...(Spread): «افرد» عناصر قائمة داخل قائمة أخرى.ifداخل القائمة: أضف العنصر فقط إذا تحقق الشرط. في Flutter تستخدمها لإظهار زر أو إخفائه حسب حالة المستخدم.
الخريطة Map
Section titled “الخريطة Map”مجموعة من أزواج مفتاح ← قيمة، مثل القاموس: تبحث بالكلمة (المفتاح) فتجد معناها (القيمة):
var student = { 'name': 'سارة', 'city': 'الإسكندرية',};
print(student['name']);student['grade'] = 'الثاني الإعدادي';print(student.length);print(student['phone']);سارة3nullلاحظ: طلب مفتاح غير موجود مثل 'phone' يُرجع null ولا ينهار البرنامج. لهذا نوع القيمة المقروءة من الخريطة يقبل null دائماً، وتحتاج ?? أو فحصاً قبل استخدامها، كما تعلمت في درس Null Safety.
المرور على الخريطة
Section titled “المرور على الخريطة”Map<String, int> prices = {'قلم': 5, 'كراسة': 15, 'مسطرة': 7};
print(prices.keys);print(prices.values);print(prices.containsKey('قلم'));
prices.forEach((item, price) { print('$item: $price جنيه');});(قلم, كراسة, مسطرة)(5, 15, 7)trueقلم: 5 جنيهكراسة: 15 جنيهمسطرة: 7 جنيهMap<String, int> تعني: المفاتيح نصوص، والقيم أرقام صحيحة. وللمرور بحلقة for استخدم entries:
var total = 0;for (var entry in prices.entries) { total += entry.value;}print('الإجمالي: $total');الإجمالي: 27المجموعة Set
Section titled “المجموعة Set”مثل القائمة، لكن بلا تكرار، وبلا ترتيب بأرقام:
var tags = {'dart', 'flutter', 'dart'};print(tags);print(tags.length);{dart, flutter}2dart المكررة حُذفت تلقائياً. استخدمها عندما يهمك «هل العنصر موجود؟» وليس «كم مرة؟».
البيانات الحقيقية: قائمة من الخرائط
Section titled “البيانات الحقيقية: قائمة من الخرائط”البيانات القادمة من الإنترنت (JSON) تأتي غالباً بهذا الشكل:
var students = [ {'name': 'أحمد', 'score': 85}, {'name': 'منى', 'score': 92},];
for (var s in students) { print('${s['name']}: ${s['score']}');}أحمد: 85منى: 92وفي الدرس القادم ستتعلم طريقة أفضل وأأمن لتمثيل كل طالب: الكلاسات.
جرّب بنفسك
Section titled “جرّب بنفسك”احسب عدد مرات تكرار كل كلمة في قائمة، باستخدام خريطة:
void main() { var words = ['تفاح', 'موز', 'تفاح', 'عنب', 'موز', 'تفاح']; var counts = <String, int>{};
for (var w in words) { counts[w] = (counts[w] ?? 0) + 1; }
print(counts);}{تفاح: 3, موز: 2, عنب: 1}لاحظ counts[w] ?? 0: في أول مرة تظهر الكلمة، قيمتها null، فنبدأ من صفر.
أخطاء شائعة
Section titled “أخطاء شائعة”- رقم خارج حدود القائمة:
colors[10]في قائمة من 3 عناصر تسبب خطأRangeError. تذكّر أن آخر رقم هوlength - 1. - نسيان toList(): نتيجة
mapوwhereليست List، فلن تجد فيها دوال مثلadd. - استخدام قيمة الخريطة مباشرة:
student['name'].lengthيرفضها المحرر لأن القيمة قد تكون null. استخدم?.أو??.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما ناتج [1, 2, 3, 4].where((n) => n > 2).toList()؟
where تحتفظ بالعناصر التي تحقق الشرط فقط، وهما 3 و 4.
سؤال
أي نوع مجموعة يحذف العناصر المكررة تلقائياً؟
Set لا تقبل التكرار، فكل قيمة تظهر فيها مرة واحدة فقط.
الخلاصة
Section titled “الخلاصة”Listمرتبة بأرقام تبدأ من صفر، وaddوremoveوcontainsلتعديلها وفحصها.whereللتصفية، وmapللتحويل، وreduceللاختزال، ومعهاtoList()....وifداخل القائمة لبنائها بمرونة.Mapأزواج مفتاح وقيمة، وقراءة مفتاح غير موجود تُرجع null.Setبلا تكرار، والبيانات الحقيقية غالباً قائمة من الخرائط.