إضافة مشروطة: 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() مفيدة بشكل خاص لتهيئة القيم الافتراضية، مثل إعداد حسابات مستخدمين جديدة أو التأكد من وجود مفاتيح معينة قبل إجراء العمليات عليها. إنها طريقة آمنة لإضافة البيانات دون الكتابة فوق المعلومات الموجودة عن طريق الخطأ.
التحدي
سهلقم بإنشاء برنامج يدير نظام تسجيل في بطولة ألعاب من خلال تتبع نتائج اللاعبين والتأكد من أن جميع اللاعبين لديهم قيم بداية افتراضية. يجب على برنامجك القيام بما يلي:
- قراءة مدخل نصي (string) يمثل اسم البطولة
- قراءة أزواج متعددة من المدخلات تمثل أسماء اللاعبين ونتائجهم الحالية (سينتهي الإدخال عندما تتلقى
"scores_done") - قراءة مدخلات نصية متعددة تمثل اللاعبين الجدد الذين يرغبون في الانضمام إلى البطولة (سينتهي الإدخال عندما تتلقى
"players_done") - إنشاء Map لتخزين أسماء اللاعبين كمفاتيح (keys) ونتائجهم كقيم (values)
- استخدام طريقة
putIfAbsent()لإضافة كل لاعب جديد بنتيجة افتراضية قدرها 0، ولكن فقط إذا لم يكونوا مسجلين بالفعل - حساب إحصائيات البطولة وطباعة تقرير التسجيل بالتنسيق الدقيق الموضح أدناه
على سبيل المثال، إذا كان اسم البطولة هو "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");
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدة