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

إضافة مشروطة: putIfAbsent

جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 29 من 65.

في بعض الأحيان تحتاج إلى إضافة زوج مفتاح-قيمة إلى Map، ولكن فقط إذا كان هذا المفتاح غير موجود بالفعل. تتعامل الطريقة putIfAbsent() مع هذا الموقف بشكل مثالي عن طريق إضافة الإدخال فقط عندما يكون المفتاح مفقوداً من الخريطة.

تأخذ هذه الطريقة معاملين: المفتاح المراد التحقق منه، والقيمة المراد إضافتها إذا كان المفتاح غائباً. إذا كان المفتاح موجوداً بالفعل، فإن putIfAbsent() لا تفعل شيئاً وتترك القيمة الموجودة دون تغيير. إذا كان المفتاح مفقوداً، فإنها تضيف زوج المفتاح والقيمة الجديد إلى الخريطة (map).

Map<String, int> gameScores = {
  'Alice': 150,
  'Bob': 200
};

// سيقوم هذا بإضافة Charlie لأنه غير موجود في الخريطة (map)
gameScores.putIfAbsent('Charlie', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

// لن يغير هذا درجة Alice لأنها موجودة بالفعل
gameScores.putIfAbsent('Alice', () => 0);
print(gameScores);  // {Alice: 150, Bob: 200, Charlie: 0}

تُعد طريقة putIfAbsent() مفيدة بشكل خاص لتهيئة القيم الافتراضية، مثل إعداد حسابات مستخدمين جديدة أو التأكد من وجود مفاتيح معينة قبل إجراء العمليات عليها. إنها طريقة آمنة لإضافة البيانات دون الكتابة فوق المعلومات الموجودة عن طريق الخطأ.

challenge icon

التحدي

سهل

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

  1. قراءة مدخل نصي (string) يمثل اسم البطولة
  2. قراءة أزواج متعددة من المدخلات تمثل أسماء اللاعبين ونتائجهم الحالية (سينتهي الإدخال عندما تتلقى "scores_done")
  3. قراءة مدخلات نصية متعددة تمثل اللاعبين الجدد الذين يرغبون في الانضمام إلى البطولة (سينتهي الإدخال عندما تتلقى "players_done")
  4. إنشاء Map لتخزين أسماء اللاعبين كمفاتيح (keys) ونتائجهم كقيم (values)
  5. استخدام طريقة putIfAbsent() لإضافة كل لاعب جديد بنتيجة افتراضية قدرها 0، ولكن فقط إذا لم يكونوا مسجلين بالفعل
  6. حساب إحصائيات البطولة وطباعة تقرير التسجيل بالتنسيق الدقيق الموضح أدناه

على سبيل المثال، إذا كان اسم البطولة هو "Spring Championship"، والنتائج الحالية تشمل "Alice" بـ 150، و "Bob" بـ 200، و "Charlie" بـ 75، واللاعبون الجدد هم "Diana"، و "Alice"، و "Eve"، فيجب أن يخرج برنامجك ما يلي:

Tournament: Spring Championship
Initial Scores: {Alice: 150, Bob: 200, Charlie: 75}
Registration Process:
Adding Diana: New player registered with score 0
Adding Alice: Player already exists, keeping score 150
Adding Eve: New player registered with score 0
Final Scores: {Alice: 150, Bob: 200, Charlie: 75, Diana: 0, Eve: 0}
Tournament Statistics:
Total registered players: 5
Players with scores above 0: 3
New players added: 2
Average score: 85.0
Status: Registration completed successfully

إذا كان اسم البطولة هو "Winter Cup"، والنتائج الحالية تشمل "John" بـ 300، و "Mary" بـ 250، واللاعبون الجدد هم "Sarah"، و "Tom"، و "John"، فيجب أن يخرج برنامجك ما يلي:

Tournament: Winter Cup
Initial Scores: {John: 300, Mary: 250}
Registration Process:
Adding Sarah: New player registered with score 0
Adding Tom: New player registered with score 0
Adding John: Player already exists, keeping score 300
Final Scores: {John: 300, Mary: 250, Sarah: 0, Tom: 0}
Tournament Statistics:
Total registered players: 4
Players with scores above 0: 2
New players added: 2
Average score: 137.5
Status: Registration completed successfully

إذا كان اسم البطولة هو "Summer League"، والنتائج الحالية تشمل "Alex" بـ 180، و "Jordan" بـ 220، و "Taylor" بـ 160، و "Morgan" بـ 190، واللاعبون الجدد هم "Casey"، و "Riley"، فيجب أن يخرج برنامجك ما يلي:

Tournament: Summer League
Initial Scores: {Alex: 180, Jordan: 220, Taylor: 160, Morgan: 190}
Registration Process:
Adding Casey: New player registered with score 0
Adding Riley: New player registered with score 0
Final Scores: {Alex: 180, Jordan: 220, Taylor: 160, Morgan: 190, Casey: 0, Riley: 0}
Tournament Statistics:
Total registered players: 6
Players with scores above 0: 4
New players added: 2
Average score: 158.33333333333334
Status: Registration completed successfully

يجب أن يستخدم برنامجك طريقة putIfAbsent() لإضافة لاعبين جدد بنتيجة افتراضية قدرها 0، مع ضمان احتفاظ اللاعبين الحاليين بنتائجهم الحالية دون تغيير. احسب متوسط الدرجات بقسمة مجموع كل الدرجات على عدد اللاعبين. احسب عدد اللاعبين الذين لديهم درجات أعلى من 0 وعدد اللاعبين الجدد الذين تمت إضافتهم بالفعل (باستثناء أولئك الذين كانوا مسجلين بالفعل). سيكون تنسيق الإدخال هو: اسم البطولة، ثم أسماء اللاعبين ونتائجهم بالتناوب (كنصوص تحتاج إلى تحويلها إلى أعداد صحيحة)، وتنتهي بـ "scores_done"، متبوعة بأسماء اللاعبين الجدد وتنتهي بـ "players_done".

ورقة مرجعية

تضيف الطريقة putIfAbsent() زوجًا من المفتاح والقيمة إلى Map فقط إذا لم يكن المفتاح موجودًا بالفعل:

Map<String, int> gameScores = {
  'Alice': 150,
  'Bob': 200
};

// يضيف Charlie لأنه غير موجود في الخريطة
gameScores.putIfAbsent('Charlie', () => 0);

// لن يغير درجة Alice لأنها موجودة بالفعل
gameScores.putIfAbsent('Alice', () => 0);

هذه الطريقة مفيدة لتهيئة القيم الافتراضية دون الكتابة فوق البيانات الموجودة.

جرّب بنفسك

import 'dart:io';

void main() {
  // قراءة اسم البطولة
  String? tournamentName = stdin.readLineSync();
  
  // إنشاء خريطة لتخزين نتائج اللاعبين
  Map<String, int> playerScores = {};
  
  // قراءة نتائج اللاعبين الحاليين
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "scores_done") break;
    
    String playerName = input!;
    String? scoreInput = stdin.readLineSync();
    int score = int.parse(scoreInput!);
    playerScores[playerName] = score;
  }
  
  // تخزين النتائج الأولية للعرض
  Map<String, int> initialScores = Map.from(playerScores);
  
  // قراءة اللاعبين الجدد للتسجيل
  List<String> newPlayers = [];
  while (true) {
    String? input = stdin.readLineSync();
    if (input == "players_done") break;
    newPlayers.add(input!);
  }
  
  // TODO: اكتب الكود الخاص بك أدناه
  // استخدم طريقة putIfAbsent() لإضافة لاعبين جدد بنتيجة افتراضية 0
  // تتبع عملية التسجيل وحساب الإحصائيات
  
  // طباعة تقرير تسجيل البطولة
  print("Tournament: $tournamentName");
  print("Initial Scores: $initialScores");
  print("Registration Process:");
  // طباعة تفاصيل عملية التسجيل هنا
  print("Final Scores: $playerScores");
  print("Tournament Statistics:");
  // طباعة الإحصائيات هنا
  print("Status: Registration completed successfully");
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow