Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تحويل قائمة إلى مجموعة

جزء من قسم 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 شائعاً للغاية عندما تحتاج إلى تنظيف البيانات عن طريق إزالة التكرارات مع الحفاظ على بنية القائمة لمزيد من المعالجة.

challenge icon

التحدي

سهل

قم بإنشاء برنامج يدير نظاماً لتنظيف البيانات عن طريق إزالة الإدخالات المكررة من ردود الاستطلاع. يجب أن يقوم برنامجك بما يلي:

  1. قراءة مدخل نصي (string) يمثل عنوان الاستطلاع
  2. قراءة مدخلات نصية متعددة تمثل ردود الاستطلاع (سينتهي الإدخال عندما تتلقى "responses_done")
  3. إنشاء قائمة (List) لتخزين جميع الردود الأصلية (بما في ذلك المكررة)
  4. استخدام Set.from() لتحويل القائمة إلى مجموعة (Set)، مما يؤدي إلى إزالة التكرارات تلقائياً
  5. استخدام toList() لتحويل المجموعة (Set) مرة أخرى إلى قائمة (List) من الردود الفريدة
  6. طباعة نتائج تنظيف البيانات بالتنسيق الدقيق الموضح أدناه

على سبيل المثال، إذا كان عنوان الاستطلاع هو "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");
  // أضف عبارات الطباعة المتبقية هنا
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow