הוספה מותנית: putIfAbsent
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 29 מתוך 65.
לפעמים צריך להוסיף זוג מפתח-ערך ל־Map, אבל רק אם המפתח הזה עדיין לא קיים. המתודה putIfAbsent() מתאימה בדיוק למצב הזה, כי היא מוסיפה את הרשומה רק כשהמפתח חסר במפה.
המתודה הזו מקבלת שני פרמטרים: המפתח שיש לבדוק, והערך שיש להוסיף אם המפתח אינו קיים. אם המפתח כבר קיים, putIfAbsent() לא עושה דבר ומשאירה את הערך הקיים ללא שינוי. אם המפתח חסר, היא מוסיפה למפה את צמד המפתח-ערך החדש.
Map<String, int> gameScores = {
'Alice': 150,
'Bob': 200
};
// זה יוסיף את Charlie כי הוא לא נמצא במפה
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() שימושית במיוחד לאתחול ערכי ברירת מחדל, למשל להגדרת חשבונות משתמשים חדשים או לווידוא שמפתחות מסוימים קיימים לפני ביצוע פעולות עליהם. זו דרך בטוחה להוסיף נתונים בלי לדרוס בטעות מידע קיים.
אתגר
קלצרו תוכנית שמנהלת מערכת הרשמה לטורניר משחקים באמצעות מעקב אחר ציוני השחקנים והבטחה שלכל השחקנים יהיו ערכי פתיחה כברירת מחדל. התוכנית שלכם צריכה:
- לקרוא קלט מסוג מחרוזת שמייצג את שם הטורניר
- לקרוא כמה זוגות של קלטים שמייצגים את שמות השחקנים ואת הציונים הנוכחיים שלהם (הקלט יסתיים כשתקבלו
"scores_done") - לקרוא כמה קלטים מסוג מחרוזת שמייצגים שחקנים חדשים שרוצים להצטרף לטורניר (הקלט יסתיים כשתקבלו
"players_done") - ליצור Map לאחסון שמות השחקנים כמפתחות והציונים שלהם כערכים
- להשתמש בשיטה
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".
נסו בעצמכם
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");
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1מניפולציות מתקדמות ברשימות
מאפייני רשימה: ראשון ואחרוןמצב הרשימה: isEmpty ו-isNotEmpהיפוך רשימההוספה לרשימה: insertהסרת פריטים מרשימה: removeWhereחיפוש ברשימה: indexOfמיון רשימהערבוב רשימהסיכום – מארגן רשימות4מניפולציה מתקדמת של Map
מעבר על Mapבדיקה אם מפתחות וערכים קיימיםמאפייני Map: מפתחות וערכיםהוספה מותנית: putIfAbsentהסרת רשומות מ־MapMaps מקונניםסיכום – עדכון מלאי2פעולות פונקציונליות על רשימות
טרנספורמציה באמצעות 'map'סינון באמצעות 'where'שימוש ב-'.toList()'בדיקת תנאים באמצעות 'any'תנאים באמצעות 'every'איתור באמצעות 'firstWhere'סיכום – סינון נתונים5פרויקט: חישוב עגלת קניות
הגדרת הפרויקטהוספת פריטים לעגלה3קבוצות
מהי קבוצה?יצירת קבוצההוספה והסרה מקבוצותבדיקת נוכחות של איברים בקבוצההמרת רשימה לקבוצהאיחוד קבוצותחיתוך קבוצותהפרש קבוצותסיכום – רשימת אורחים ייחודית6טיפול בסיסי בשגיאות
מהן חריגות?בלוק ה-try-catchתפיסת חריגות באמצעות onבלוק ה-finallyהשלכת חריגהסיכום – חלוקה בטוחה9טיפוסי מנייה (Enums)
מה הם Enums?הגדרת Enum פשוטשימוש ב-Enums במשתניםEnums במשפטי 'switch'סיכום – רמזורתרגלו בעצמכם: קומפיילר Dart אונליין