في لغة Dart، الكلمة المفتاحية Set تُستخدم لتعريف مجموعة غير مرتبة من القيم الفريدة (أي لا تحتوي على عناصر مكررة).
تُعتبر Set نوعًا من أنواع البيانات الشائعة في Dart وتستخدم عندما تحتاج إلى تخزين عناصر غير مكررة دون الاهتمام بترتيبها.
✅ الخصائص الأساسية للـ Set
- غير مرتبة (Unordered)
لا تضمنSetترتيب العناصر كما أُضيفت. - لا تقبل التكرار (No Duplicates)
إذا حاولت إضافة عنصر مكرر، سيتم تجاهله. - أنواع البيانات
يمكن لـSetأن تحتوي على أي نوع من البيانات (int, String, …).
🔹 إنشاء Set في Dart
void main() {
Set<String> fruits = {'apple', 'banana', 'orange'};
print(fruits); // {apple, banana, orange}
}PHP- لاحظ الأقواس
{}، لكن إذا أردت مجموعة فارغة، لا تستخدم{}لأنها تُمثل Map، بل استخدمSet():
Set<String> emptySet = Set(); // أو Set<String>()PHP🔹 إضافة عناصر
Set<int> numbers = {1, 2, 3};
numbers.add(4);
numbers.add(2); // لن يُضاف لأنه مكرر
print(numbers); // {1, 2, 3, 4}PHP🔹 إضافة أكثر من عنصر دفعة واحدة
numbers.addAll([5, 6, 7]);PHP🔹 حذف عنصر
numbers.remove(3); // يحذف العنصر 3PHP🔹 التحقق من وجود عنصر
print(numbers.contains(2)); // truePHP🔹 معرفة عدد العناصر
print(numbers.length);
print(numbers.first);
print(numbers.last);
print(numbers.isEmpty);
print(numbers.isNotEmpty);PHP🔹 التكرار (Looping)
for (var num in numbers) {
print(num);
}PHP🔹 تحويل Set إلى List والعكس
Set<String> names = {'Ali', 'Omar', 'Sara'};
List<String> namesList = names.toList();
List<int> myList = [1, 2, 2, 3];
Set<int> mySet = myList.toSet(); // {1, 2, 3}PHP🔹 العمليات على Sets (التقاطع، الاتحاد، الفرق)
Set<int> a = {1, 2, 3};
Set<int> b = {3, 4, 5};
print(a.union(b)); // {1, 2, 3, 4, 5}
print(a.intersection(b)); // {3}
print(a.difference(b)); // {1, 2}PHP🔹 الخصائص والدوال المهمة
| الخاصية / الدالة | الشرح |
|---|---|
add(value) | يضيف عنصر |
remove(value) | يحذف عنصر |
contains(value) | يتحقق من وجود عنصر |
length | عدد العناصر |
clear() | يمسح جميع العناصر |
isEmpty / isNotEmpty | هل المجموعة فارغة أم لا |
toList() | يحول إلى قائمة |
elementAt(index) | يجلب عنصر حسب الفهرس (لكن لا يُنصح به لأن Set غير مرتبة) |
📌 ملاحظات مهمة
- لا تستخدم
elementAtإلا للقراءة المؤقتة، لأنSetغير مرتبة وقد يتغير الترتيب في كل مرة. - في حال كنت بحاجة لحفظ البيانات مع الحفاظ على الترتيب، استخدم
Listبدلًا منSet.
✅ مثال تطبيقي شامل
void main() {
Set<String> students = {'Ali', 'Sara', 'Mohamed'};
students.add('Omar');
students.add('Ali'); // لن يُضاف
print("الطلاب: $students"); // {Ali, Sara, Mohamed, Omar}
print("هل يوجد Sara؟ ${students.contains('Sara')}");
students.remove('Mohamed');
print("عدد الطلاب: ${students.length}");
print("الطلاب واحداً تلو الآخر:");
for (var name in students) {
print(name);
}
}PHP✅ 1. أنواع Sets: HashSet وLinkedHashSet وSplayTreeSet
في Dart، Set هي واجهة (interface)، ويوجد عدة أنواع منها:
| النوع | الوصف |
|---|---|
HashSet | الافتراضي في Dart. لا يضمن الترتيب. أداءه عالي عند الإضافة والبحث. |
LinkedHashSet | يحافظ على ترتيب الإدخال. مفيد عندما تحتاج لترتيب ثابت للعناصر. |
SplayTreeSet | يقوم بترتيب العناصر ترتيبًا طبيعيًا (مثل الأرقام أو الحروف). مفيد للترتيب التلقائي، لكنه أبطأ من HashSet. |
مثال:
import 'dart:collection';
void main() {
var orderedSet = LinkedHashSet<String>();
orderedSet.addAll(['banana', 'apple', 'orange']);
print(orderedSet); // يحافظ على ترتيب الإدخال
var sortedSet = SplayTreeSet<int>();
sortedSet.addAll([10, 2, 5]);
print(sortedSet); // يتم ترتيب العناصر تلقائيًا: {2, 5, 10}
}PHP✅ 3. Set is Iterable (قابل للتكرار)
Set تطبّق واجهة Iterable، لذا يمكنك استخدام كل دوال Iterable مثل:
wheremapforEachany,everyreduce,fold
مثال:
var numbers = {1, 2, 3, 4, 5};
var even = numbers.where((n) => n.isEven);
print(even); // (2, 4)PHP✅ 4. الفرق بين Set و List من حيث الأداء
| العملية | List | Set (HashSet) |
|---|---|---|
contains() | O(n) | O(1) تقريبا |
add() | O(1) | O(1) |
| يسمح بالتكرار؟ | نعم | لا |
| يحافظ على الترتيب؟ | نعم | لا (إلا مع LinkedHashSet) |
✅ 5. استخدام spread operator و if داخل Set
Dart تدعم spread operator و collection if داخل المجموعات:
var addExtra = true;
var baseSet = {'a', 'b', 'c'};
var fullSet = {
...baseSet,
if (addExtra) 'd',
};
print(fullSet); // {a, b, c, d}PHP✅ 6. الفرق بين Set و Map
Set<String> s = {'one', 'two'}; // فقط القيم
Map<String, int> m = {'one': 1}; // مفتاح وقيمةPHP🟢 الخلاصة:
| الخاصية | Set |
|---|---|
| تخزين عناصر فريدة فقط | ✅ نعم |
| الترتيب مضمون | ❌ لا (إلا في LinkedHashSet) |
| التكرار ممكن | ✅ نعم |
كائنات مخصصة تحتاج == و hashCode | ✅ نعم |
| أداء عالي للبحث والإضافة | ✅ (خاصة HashSet) |
إذا كنت تفكر في استخدامات متقدمة مثل فلترة بيانات كبيرة أو البحث السريع أو تجنب التكرار، فإن Set خيار ممتاز في Dart.