מעבר על Map
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 26 מתוך 65.
כשעובדים עם אוספי Map, לעיתים קרובות צריך לעבד כל זוג של מפתח וערך. השיטה forEach מספקת דרך פשוטה לעבור על כל הרשומות במפה, ומאפשרת לך לגשת גם למפתח וגם לערך המתאים לו.
המתודה forEach מקבלת פונקציה כארגומנט. הפונקציה מקבלת שני פרמטרים: המפתח והערך של כל רשומה במפה. המתודה קוראת לפונקציה שלך באופן אוטומטי פעם אחת עבור כל זוג מפתח-ערך במפה.
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 נקודותהגישה הזו נוחה הרבה יותר מאשר גישה ידנית לכל מפתח או ניסיון לעבור בלולאה על המפה באמצעות שיטות אחרות. המתודה forEach מטפלת עבורך בכל לוגיקת האיטרציה, וכך הקוד שלך נקי וקריא יותר כשצריך לעבד כל רשומה במפה.
אתגר
קלצרו תוכנית שמנהלת מערכת לדיווח על המכירות היומיות של מסעדה באמצעות ניתוח פריטי התפריט ונתוני המכירות שלהם. התוכנית שלכם צריכה:
- לקרוא קלט מסוג מחרוזת שמייצג את שם המסעדה
- לקרוא כמה זוגות של קלטים שמייצגים פריטי תפריט ואת סכומי המכירות שלהם (הקלט יסתיים כשתקבלו
"sales_done") - ליצור Map כדי לאחסן כל פריט תפריט כמפתח ואת סכום המכירות שלו כערך
- להשתמש בשיטה
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".
נסו בעצמכם
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:");
// הציגו כל פריט וחשבו את הסכום הכולל
// מצאו והציגו את הפריט הנמכר ביותר
// הציגו את סך ההכנסות ואת הסטטוס
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
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 אונליין