تحويل قائمة إلى مجموعة
جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 21 من 65.
أحد أكثر التطبيقات العملية لـ Set هو إزالة العناصر المكررة من List. بما أن المجموعات (sets) تحذف التكرارات تلقائياً، يمكنك بسهولة تحويل قائمة تحتوي على قيم متكررة إلى مجموعة من العناصر الفريدة.
لتحويل List إلى Set، يمكنك ببساطة تمرير القائمة إلى المنشئ Set.from(). يؤدي هذا إلى إنشاء مجموعة جديدة تحتوي على جميع العناصر الفريدة من القائمة الأصلية.
List<int> numbersWithDuplicates = [1, 2, 2, 3, 3, 3, 4, 5, 5];
Set<int> uniqueNumbers = Set.from(numbersWithDuplicates);
print(uniqueNumbers); // {1, 2, 3, 4, 5}إذا كنت بحاجة إلى استعادة النتيجة كـ List (ربما للحفاظ على التوافق مع أجزاء أخرى من التعليمات البرمجية الخاصة بك)، يمكنك تحويل المجموعة مرة أخرى إلى قائمة باستخدام toList(). يمنحك هذا قائمة تحتوي فقط على العناصر الفريدة من القائمة الأصلية.
List<int> uniqueList = Set.from(numbersWithDuplicates).toList();
print(uniqueList); // [1, 2, 3, 4, 5]يعد هذا النمط من List ← Set ← List شائعاً للغاية عندما تحتاج إلى تنظيف البيانات عن طريق إزالة التكرارات مع الحفاظ على بنية القائمة لمزيد من المعالجة.
التحدي
سهلقم بإنشاء برنامج يدير نظاماً لتنظيف البيانات عن طريق إزالة الإدخالات المكررة من ردود الاستطلاع. يجب أن يقوم برنامجك بما يلي:
- قراءة مدخل نصي (string) يمثل عنوان الاستطلاع
- قراءة مدخلات نصية متعددة تمثل ردود الاستطلاع (سينتهي الإدخال عندما تتلقى
"responses_done") - إنشاء قائمة (List) لتخزين جميع الردود الأصلية (بما في ذلك المكررة)
- استخدام
Set.from()لتحويل القائمة إلى مجموعة (Set)، مما يؤدي إلى إزالة التكرارات تلقائياً - استخدام
toList()لتحويل المجموعة (Set) مرة أخرى إلى قائمة (List) من الردود الفريدة - طباعة نتائج تنظيف البيانات بالتنسيق الدقيق الموضح أدناه
على سبيل المثال، إذا كان عنوان الاستطلاع هو "Customer Satisfaction Survey" والردود هي "Excellent"، "Good"، "Excellent"، "Fair"، "Good"، "Excellent"، "Poor"، فيجب أن يخرج برنامجك ما يلي:
Survey: Customer Satisfaction Survey
Original responses: [Excellent, Good, Excellent, Fair, Good, Excellent, Poor]
Total responses collected: 7
Converting to Set to remove duplicates...
Unique responses (Set): {Excellent, Good, Fair, Poor}
Converting back to List...
Cleaned responses: [Excellent, Good, Fair, Poor]
Duplicates removed: 3
Final unique responses: 4
Status: Data cleaning completed successfullyإذا كان عنوان الاستطلاع هو "Product Feedback" والردود هي "Like"، "Dislike"، "Like"، "Like"، فيجب أن يخرج برنامجك ما يلي:
Survey: Product Feedback
Original responses: [Like, Dislike, Like, Like]
Total responses collected: 4
Converting to Set to remove duplicates...
Unique responses (Set): {Like, Dislike}
Converting back to List...
Cleaned responses: [Like, Dislike]
Duplicates removed: 2
Final unique responses: 2
Status: Data cleaning completed successfullyإذا كان عنوان الاستطلاع هو "Event Rating" والردود هي "Amazing"، "Okay"، "Great"، فيجب أن يخرج برنامجك ما يلي:
Survey: Event Rating
Original responses: [Amazing, Okay, Great]
Total responses collected: 3
Converting to Set to remove duplicates...
Unique responses (Set): {Amazing, Okay, Great}
Converting back to List...
Cleaned responses: [Amazing, Okay, Great]
Duplicates removed: 0
Final unique responses: 3
Status: Data cleaning completed successfullyيجب أن يوضح برنامجك نمط التحويل الكامل List ← Set ← List. قم أولاً بتخزين جميع الردود في List، ثم استخدم Set.from() لإنشاء Set من الـ List، وأخيراً استخدم toList() لتحويل الـ Set مرة أخرى إلى List. احسب عدد التكرارات التي تمت إزالتها عن طريق طرح العدد النهائي الفريد من العدد الإجمالي الأصلي.
ورقة مرجعية
لإزالة التكرارات من List، قم بتحويلها إلى Set باستخدام Set.from():
List<int> numbersWithDuplicates = [1, 2, 2, 3, 3, 3, 4, 5, 5];
Set<int> uniqueNumbers = Set.from(numbersWithDuplicates);
print(uniqueNumbers); // {1, 2, 3, 4, 5}لتحويل Set مرة أخرى إلى List، استخدم toList():
List<int> uniqueList = Set.from(numbersWithDuplicates).toList();
print(uniqueList); // [1, 2, 3, 4, 5]يُستخدم نمط List ← Set ← List بشكل شائع لتنظيف البيانات مع الحفاظ على بنية القائمة.
جرّب بنفسك
import 'dart:io';
void main() {
// قراءة عنوان الاستطلاع
String? surveyTitle = stdin.readLineSync();
// قراءة ردود الاستطلاع حتى "responses_done"
List<String> originalResponses = [];
String? response;
while ((response = stdin.readLineSync()) != "responses_done") {
if (response != null) {
originalResponses.add(response);
}
}
// TODO: اكتب الكود الخاص بك أدناه
// 1. استخدم Set.from() لتحويل القائمة إلى Set (يزيل التكرارات)
// 2. استخدم toList() لتحويل الـ Set مرة أخرى إلى قائمة
// 3. احسب عدد التكرارات التي تمت إزالتها والأعداد النهائية
// طباعة النتائج بالتنسيق المطلوب
print("Survey: $surveyTitle");
print("Original responses: $originalResponses");
// أضف عبارات الطباعة المتبقية هنا
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التعامل المتقدم مع القوائم
خصائص القائمة: first و lastحالة القائمة: isEmpty و isNotEmptyعكس القائمةالإضافة إلى القائمة: insertالحذف من القائمة: removeWhereالبحث في القائمة: indexOfفرز القائمةخلط القائمةملخص - منظم القوائم4معالجة الـ Map المتقدمة
التكرار عبر الـ Mapالتحقق من المفاتيح والقيمخصائص الـ Map: keys و valuesإضافة مشروطة: putIfAbsentإزالة العناصر من الـ Mapالـ Maps المتداخلةمراجعة - تحديث المخزون2عمليات القوائم الوظيفية
التحويل باستخدام 'map'التصفية باستخدام 'where'استخدام '.toList()'التحقق من الشروط باستخدام 'any'الشروط باستخدام 'every'البحث باستخدام 'firstWhere'مراجعة - تصفية البيانات5مشروع: حاسبة عربة التسوق
إعداد المشروعإضافة العناصر إلى العربة3المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدة