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

التكرار عبر الـ 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 مع كل منطق التكرار نيابة عنك، مما يجعل الكود الخاص بك أكثر نظافة وقابلية للقراءة عندما تحتاج إلى معالجة كل إدخال في الخريطة.

challenge icon

التحدي

سهل

قم بإنشاء برنامج يدير نظام تقارير المبيعات اليومية للمطعم من خلال تحليل عناصر القائمة وبيانات مبيعاتها. يجب أن يقوم برنامجك بما يلي:

  1. قراءة مدخل نصي (string) يمثل اسم المطعم
  2. قراءة أزواج متعددة من المدخلات تمثل عناصر القائمة ومبالغ مبيعاتها (سينتهي الإدخال عندما تتلقى "sales_done")
  3. إنشاء Map لتخزين كل عنصر من عناصر القائمة كمفتاح (key) ومبلغ مبيعاته كقيمة (value)
  4. استخدام طريقة forEach للتكرار عبر بيانات المبيعات وحساب إجمالي الإيرادات
  5. استخدام طريقة forEach مرة أخرى لتحديد العنصر الأكثر مبيعاً (أعلى مبلغ مبيعات)
  6. طباعة تقرير المبيعات بالتنسيق الدقيق الموضح أدناه

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

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

جميع دروس Logic & Flow