الفرق بين المجموعات
جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 24 من 65.
في بعض الأحيان قد تحتاج إلى العثور على العناصر الموجودة في Set واحد ولكنها ليست موجودة في آخر. تقوم طريقة difference() بحل هذه المشكلة عن طريق إنشاء مجموعة جديدة تحتوي فقط على العناصر من المجموعة الأولى التي ليست موجودة في المجموعة الثانية.
فكر في الأمر كعملية طرح للمجموعات - فأنت تقوم بإزالة جميع عناصر المجموعة الثانية من المجموعة الأولى. تُرجع الطريقة difference() مجموعة جديدة تحتوي على العناصر المتبقية، مع ترك كلتا المجموعتين الأصليتين دون تغيير.
Set<String> todaysTasks = {'email', 'meeting', 'report', 'calls'};
Set<String> completedTasks = {'email', 'calls'};
Set<String> remainingTasks = todaysTasks.difference(completedTasks);
print(remainingTasks); // {meeting, report}هذه العملية مفيدة بشكل خاص للعثور على ما هو مفقود، أو ما تبقى للقيام به، أو ما هو فريد لمجموعة واحدة مقارنة بأخرى. وعلى عكس التقاطع الذي يجد القواسم المشتركة، يبرز الفرق ما يجعل مجموعة واحدة متميزة عن الأخرى.
التحدي
سهلقم بإنشاء برنامج يدير نظام إدارة مشاريع من خلال تحديد المهام المخطط لها والتي لم تكتمل بعد. يجب على برنامجك القيام بما يلي:
- قراءة مدخل نصي (string) يمثل اسم المشروع
- قراءة مدخلات نصية متعددة تمثل المهام المخطط لها (سينتهي الإدخال عندما تتلقى
"planned_done") - قراءة مدخلات نصية متعددة تمثل المهام المكتملة (سينتهي الإدخال عندما تتلقى
"completed_done") - إنشاء مجموعتين (Sets) منفصلتين لتخزين المهام المخطط لها والمهام المكتملة
- استخدام طريقة
difference()للعثور على المهام المخطط لها والتي لم تكتمل بعد - طباعة تحليل حالة المشروع بالتنسيق الدقيق الموضح أدناه
على سبيل المثال، إذا كان اسم المشروع هو "Website Launch"، والمهام المخطط لها هي "Design mockups"، "Write content"، "Setup database"، "Test functionality"، "Deploy site"، والمهام المكتملة هي "Design mockups"، "Setup database"، يجب أن يخرج برنامجك ما يلي:
Project: Website Launch
Planned tasks: {Design mockups, Write content, Setup database, Test functionality, Deploy site}
Completed tasks: {Design mockups, Setup database}
Remaining tasks: {Write content, Test functionality, Deploy site}
Tasks completed: 2
Tasks remaining: 3
Progress: 40.0% complete
Status: Project in progress - 3 task(s) remainingإذا كان اسم المشروع هو "Mobile App Development"، والمهام المخطط لها هي "Create wireframes"، "Develop UI"، "Implement features"، والمهام المكتملة هي "Create wireframes"، "Develop UI"، "Implement features"، يجب أن يخرج برنامجك ما يلي:
Project: Mobile App Development
Planned tasks: {Create wireframes, Develop UI, Implement features}
Completed tasks: {Create wireframes, Develop UI, Implement features}
Remaining tasks: {}
Tasks completed: 3
Tasks remaining: 0
Progress: 100.0% complete
Status: Project completed successfullyإذا كان اسم المشروع هو "Marketing Campaign"، والمهام المخطط لها هي "Research target audience"، "Create content"، "Design graphics"، "Launch campaign"، "Analyze results"، والمهام المكتملة هي "Research target audience"، يجب أن يخرج برنامجك ما يلي:
Project: Marketing Campaign
Planned tasks: {Research target audience, Create content, Design graphics, Launch campaign, Analyze results}
Completed tasks: {Research target audience}
Remaining tasks: {Create content, Design graphics, Launch campaign, Analyze results}
Tasks completed: 1
Tasks remaining: 4
Progress: 20.0% complete
Status: Project in progress - 4 task(s) remainingيجب أن يستخدم برنامجك طريقة difference() للعثور على المهام الموجودة في مجموعة المهام المخطط لها ولكنها ليست في مجموعة المهام المكتملة. احسب نسبة التقدم بقسمة المهام المكتملة على إجمالي المهام المخطط لها والضرب في 100، مع التقريب إلى منزلة عشرية واحدة. إذا اكتملت جميع المهام، فاعرض "Project completed successfully" كحالة، وإلا فاعرض "Project in progress - X task(s) remaining" حيث X هو عدد المهام المتبقية.
ورقة مرجعية
تنشئ الطريقة difference() مجموعة جديدة تحتوي على العناصر من المجموعة الأولى التي ليست موجودة في المجموعة الثانية:
Set<String> todaysTasks = {'email', 'meeting', 'report', 'calls'};
Set<String> completedTasks = {'email', 'calls'};
Set<String> remainingTasks = todaysTasks.difference(completedTasks);
print(remainingTasks); // {meeting, report}تشبه هذه العملية عملية الطرح للمجموعات - فهي تزيل جميع عناصر المجموعة الثانية من المجموعة الأولى، وتعيد مجموعة جديدة تحتوي على العناصر المتبقية مع ترك كلتا المجموعتين الأصليتين دون تغيير.
جرّب بنفسك
import 'dart:io';
void main() {
// قراءة اسم المشروع
String? projectName = stdin.readLineSync();
// قراءة المهام المخطط لها حتى "planned_done"
Set<String> plannedTasks = <String>{};
String? task;
while ((task = stdin.readLineSync()) != "planned_done") {
if (task != null) {
plannedTasks.add(task);
}
}
// قراءة المهام المكتملة حتى "completed_done"
Set<String> completedTasks = <String>{};
while ((task = stdin.readLineSync()) != "completed_done") {
if (task != null) {
completedTasks.add(task);
}
}
// TODO: اكتب الكود الخاص بك أدناه
// استخدم طريقة difference() للعثور على المهام المتبقية
// احسب نسبة التقدم
// حدد حالة المشروع
// طباعة النتائج
print("Project: $projectName");
print("Planned tasks: $plannedTasks");
print("Completed tasks: $completedTasks");
// أضف عبارات الإخراج المتبقية هنا
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدة