🧠 ما هي Map
في Dart؟
Map
هي بنية بيانات (Data Structure) تُستخدم لتخزين أزواج من المفتاح والقيمة (key => value
).
كل مفتاح في Map
يجب أن يكون فريدًا، ولكن القيم يمكن أن تتكرر.
تشبه Dictionary في Python أو Object في JavaScript.
✅ تعريف بسيط:
void main() {
Map<String, int> ages = {
'Ali': 25,
'Sara': 30,
'Omar': 22,
};
print(ages['Sara']); // 30
}
PHP✅ طريقة إنشاء Map
1. باستخدام الأقواس {}
:
Map<String, int> myMap = {'a': 1, 'b': 2};
PHP2. باستخدام الدالة Map()
:
Map<String, String> cities = Map();
cities['Egypt'] = 'Cairo';
cities['France'] = 'Paris';
PHP3. خريطة فارغة:
Map<String, int> empty = {};
PHP📌 الخصائص الأساسية
الخاصية / الدالة | الوصف |
---|---|
map[key] | الوصول للقيمة المرتبطة بالمفتاح |
map[key] = value | تعيين قيمة لمفتاح |
addAll({}) | إضافة عناصر جديدة |
containsKey(key) | التحقق من وجود مفتاح |
containsValue(value) | التحقق من وجود قيمة |
remove(key) | حذف عنصر |
length | عدد العناصر |
isEmpty / isNotEmpty | هل الخريطة فارغة؟ |
clear() | حذف جميع العناصر |
🧪 أمثلة عملية
🔹 إضافة وتعديل القيم:
var user = {'name': 'Yasin', 'age': 26};
user['age'] = 27; // تعديل
user['country'] = 'Egypt'; // إضافة
PHP🔹 التكرار على Map
:
user.forEach((key, value) {
print('$key: $value');
});
PHPأو باستخدام for in
:
for (var entry in user.entries) {
print('${entry.key} => ${entry.value}');
}
PHP🔍 البحث والتحقق
print(user.containsKey('name')); // true
print(user.containsValue('Egypt')); // true
PHP🔁 تحويل Map إلى List
var keys = user.keys.toList(); // ['name', 'age', 'country']
var values = user.values.toList(); // ['Yasin', 27, 'Egypt']
PHP🧩 التحديث المشروط
user.update('name', (oldValue) => 'Ahmed'); // إذا وُجد
user.update('city', (v) => 'Cairo', ifAbsent: () => 'Cairo'); // إذا لم يوجد
PHP🔥 حذف عنصر
user.remove('age');
PHP🧠 استخدام Map
المتداخلة
Map<String, Map<String, dynamic>> students = {
'Ali': {'age': 22, 'grade': 'A'},
'Sara': {'age': 23, 'grade': 'B'},
};
print(students['Ali']?['grade']); // A
PHP⚠️ محاذير هامة
المحذور | التوضيح |
---|---|
تعديل القيم أثناء التكرار | قد يسبب خطأ أو نتائج غير متوقعة |
المفاتيح لا تُكرر | إدخال مفتاح موجود مسبقًا يستبدل القديم |
Map غير مرتبة (في النوع العادي) | استخدم LinkedHashMap إذا أردت الحفاظ على الترتيب |
استخدام كائن كـ key بدون hashCode | سيتسبب في سلوك غير متوقع |
🏗️ أنواع Map
في Dart
النوع | الوصف |
---|---|
Map (الافتراضي) | غير مرتب |
LinkedHashMap | يحافظ على ترتيب الإدخال |
SplayTreeMap | يُرتب المفاتيح تلقائيًا |
HashMap | أسرع نوع، لا يحافظ على ترتيب |
مثال:
import 'dart:collection';
void main() {
var map = SplayTreeMap<String, int>();
map['c'] = 3;
map['a'] = 1;
map['b'] = 2;
print(map); // {a: 1, b: 2, c: 3}
}
PHP✅ الفرق بين Map
و Set
و List
الخاصية | Map | Set | List |
---|---|---|---|
نوع المحتوى | مفتاح => قيمة | قيمة فريدة فقط | أي قيم (تكرار مسموح) |
ترتيب العناصر؟ | لا (إلا LinkedHash) | لا (إلا LinkedHashSet) | نعم |
يقبل التكرار؟ | لا للمفاتيح | لا | نعم |
الوصول للعناصر | بالمفتاح | لا يوجد فهرس | بالفهرس |
🧠 متى أستخدم Map
؟
استخدم Map
عندما:
- تحتاج إلى ربط مفتاح بقيمة (مثل: الاسم => العمر)
- تحتاج إلى البحث السريع بالقيمة المرتبطة بمفتاح
- تحتاج إلى تمثيل JSON
- تخزين بيانات منظمة لها معرف
📦 مثال عملي نهائي
Map<String, dynamic> product = {
'id': 101,
'name': 'Laptop',
'price': 1500,
'available': true,
};
print('اسم المنتج: ${product['name']}');
if (product.containsKey('price')) {
print('السعر: ${product['price']}');
}
product['price'] = 1400; // تعديل السعر
product.remove('available');
print('المنتج النهائي:');
product.forEach((k, v) => print('$k => $v'));
PHP