التكرار عبر الـ Map
جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 26 من 65.
عند العمل مع مجموعات Map، غالباً ما تحتاج إلى معالجة كل زوج من المفاتيح والقيم. توفر طريقة forEach وسيلة نظيفة للتكرار عبر جميع الإدخالات في الخريطة، مما يمنحك الوصول إلى كل من المفتاح والقيمة المقابلة له.
تأخذ الطريقة forEach دالة كوسيط (argument). تستقبل هذه الدالة معاملين: المفتاح والقيمة لكل إدخال في الخريطة (map). تقوم الطريقة تلقائياً باستدعاء دالتك مرة واحدة لكل زوج مفتاح-قيمة في الخريطة.
Map<String, int> studentScores = {
'Alice': 85,
'Bob': 92,
'Charlie': 78
};
studentScores.forEach((name, score) {
print('$name scored $score points');
});
// المخرجات:
// سجلت Alice 85 نقطة
// سجل Bob 92 نقطة
// سجل Charlie 78 نقطةهذا النهج أكثر ملاءمة بكثير من الوصول يدوياً إلى كل مفتاح أو محاولة التكرار عبر الخريطة (map) باستخدام طرق أخرى. تتعامل طريقة forEach مع كل منطق التكرار نيابة عنك، مما يجعل الكود الخاص بك أكثر نظافة وقابلية للقراءة عندما تحتاج إلى معالجة كل إدخال في الخريطة.
التحدي
سهلقم بإنشاء برنامج يدير نظام تقارير المبيعات اليومية للمطعم من خلال تحليل عناصر القائمة وبيانات مبيعاتها. يجب أن يقوم برنامجك بما يلي:
- قراءة مدخل نصي (string) يمثل اسم المطعم
- قراءة أزواج متعددة من المدخلات تمثل عناصر القائمة ومبالغ مبيعاتها (سينتهي الإدخال عندما تتلقى
"sales_done") - إنشاء Map لتخزين كل عنصر من عناصر القائمة كمفتاح (key) ومبلغ مبيعاته كقيمة (value)
- استخدام طريقة
forEachللتكرار عبر بيانات المبيعات وحساب إجمالي الإيرادات - استخدام طريقة
forEachمرة أخرى لتحديد العنصر الأكثر مبيعاً (أعلى مبلغ مبيعات) - طباعة تقرير المبيعات بالتنسيق الدقيق الموضح أدناه
على سبيل المثال، إذا كان اسم المطعم هو "Mario's Pizza" وتضمنت بيانات المبيعات "Margherita Pizza" بمبلغ 450، و "Caesar Salad" بمبلغ 280، و "Garlic Bread" بمبلغ 320، و "Tiramisu" بمبلغ 180، فيجب أن يخرج برنامجك ما يلي:
Restaurant: Mario's Pizza
Daily Sales Report:
Margherita Pizza: $450
Caesar Salad: $280
Garlic Bread: $320
Tiramisu: $180
Total Revenue: $1230
Best Selling Item: Margherita Pizza ($450)
Status: Sales report generated successfullyإذا كان اسم المطعم هو "Sushi Express" وتضمنت بيانات المبيعات "California Roll" بمبلغ 380، و "Salmon Sashimi" بمبلغ 520، و "Miso Soup" بمبلغ 150، فيجب أن يخرج برنامجك ما يلي:
Restaurant: Sushi Express
Daily Sales Report:
California Roll: $380
Salmon Sashimi: $520
Miso Soup: $150
Total Revenue: $1050
Best Selling Item: Salmon Sashimi ($520)
Status: Sales report generated successfullyإذا كان اسم المطعم هو "Burger Palace" وتضمنت بيانات المبيعات "Classic Burger" بمبلغ 600، و "French Fries" بمبلغ 400، و "Milkshake" بمبلغ 250، و "Onion Rings" بمبلغ 180، فيجب أن يخرج برنامجك ما يلي:
Restaurant: Burger Palace
Daily Sales Report:
Classic Burger: $600
French Fries: $400
Milkshake: $250
Onion Rings: $180
Total Revenue: $1430
Best Selling Item: Classic Burger ($600)
Status: Sales report generated successfullyيجب أن يستخدم برنامجك طريقة forEach للتكرار عبر مدخلات الـ Map. أولاً، استخدم forEach لعرض كل عنصر في القائمة ومبلغ مبيعاته، مع حساب إجمالي الإيرادات أيضاً. ثم استخدم forEach مرة أخرى للعثور على العنصر الذي حقق أعلى مبلغ مبيعات. سيكون تنسيق الإدخال: اسم المطعم، ثم أسماء عناصر القائمة ومبالغ المبيعات بالتناوب (كنصوص تحتاج إلى تحويلها إلى أعداد صحيحة)، وينتهي بـ "sales_done".
ورقة مرجعية
تسمح لك طريقة forEach بالتكرار عبر جميع أزواج المفتاح والقيمة في Map. وهي تأخذ دالة تستقبل معاملين: المفتاح والقيمة لكل مدخل.
Map<String, int> studentScores = {
'Alice': 85,
'Bob': 92,
'Charlie': 78
};
studentScores.forEach((name, score) {
print('$name scored $score points');
});
// المخرجات:
// Alice scored 85 points
// Bob scored 92 points
// Charlie scored 78 pointsتقوم طريقة forEach تلقائياً باستدعاء دالتك مرة واحدة لكل زوج مفتاح-قيمة في الخريطة، مما يجعلها مريحة لمعالجة جميع المدخلات دون الحاجة إلى منطق تكرار يدوي.
جرّب بنفسك
import 'dart:io';
void main() {
// قراءة اسم المطعم
String? restaurantName = stdin.readLineSync();
// إنشاء Map لتخزين عناصر القائمة ومبالغ مبيعاتها
Map<String, int> salesData = {};
// قراءة عناصر القائمة ومبالغ المبيعات حتى "sales_done"
while (true) {
String? input = stdin.readLineSync();
if (input == "sales_done") {
break;
}
String menuItem = input!;
String? salesAmountStr = stdin.readLineSync();
int salesAmount = int.parse(salesAmountStr!);
salesData[menuItem] = salesAmount;
}
// TODO: اكتب الكود الخاص بك أدناه
// استخدم forEach لحساب إجمالي الإيرادات وعرض بيانات المبيعات
// استخدم forEach مرة أخرى للعثور على العنصر الأكثر مبيعاً
// طباعة تقرير المبيعات بالتنسيق المطلوب
print("Restaurant: $restaurantName");
print("Daily Sales Report:");
// عرض كل عنصر وحساب الإجمالي
// العثور على العنصر الأكثر مبيعاً وعرضه
// عرض إجمالي الإيرادات والحالة
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدة