Maps מקוננים
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 31 מתוך 65.
לפעמים צריך לארגן נתונים במבנה היררכי מורכב יותר מזוג פשוט של מפתח-ערך. מפות מקוננות מאפשרות לאחסן מפות כערכים בתוך מפות אחרות, וכך ליצור כמה רמות של ארגון נתונים.
מפה מקוננת היא פשוט Map שהערכים בה הם בעצמם אובייקטים מסוג Map. המבנה הזה מושלם לייצוג נתונים שיש בהם קטגוריות ותת־קטגוריות, כמו פרופילי משתמשים עם פרטים רבים, או קטלוגים של מוצרים עם מאפיינים שונים.
Map<String, Map<String, dynamic>> userProfiles = {
'alice': {
'email': 'alice@example.com',
'age': 28
},
'bob': {
'email': 'bob@example.com',
'age': 32
}
};
print(userProfiles['alice']['email']); // alice@example.com
print(userProfiles['bob']['age']); // 32כדי לגשת לנתונים במפה מקוננת, משתמשים בכמה זוגות של סוגריים מרובעים. הזוג הראשון ניגש למפתח במפה החיצונית, והזוג השני ניגש למפתח במפה הפנימית. המבנה הדו-רמתי הזה מקל על קיבוץ מידע קשור תוך שמירה על הסדר והנגישות שלו.
אתגר
קלצרו תוכנית שמנהלת מערכת ספרייה של עובדי חברה באמצעות מפות מקוננות לאחסון מידע מפורט על העובדים. התוכנית שלכם צריכה:
- לקרוא קלט מסוג מחרוזת שמייצג את שם החברה
- לקרוא כמה קבוצות של קלטים שמייצגות נתוני עובדים (הקלט יסתיים כשתקבלו
"employees_done"). לכל עובד יהיו:- שם (מחרוזת)
- מחלקה (מחרוזת)
- משכורת (מחרוזת שיש להמיר למספר שלם)
- שנות ניסיון (מחרוזת שיש להמיר למספר שלם)
- לקרוא קלט מסוג מחרוזת שמייצג מזהה עובד לחיפוש
- ליצור Map מקוננת שבה כל מזהה עובד הוא מפתח, והערך הוא Map נוספת שמכילה את פרטי העובד
- לגשת למידע של עובד מסוים ולהציג אותו באמצעות גישה למפה מקוננת
- לחשב נתונים סטטיסטיים לפי מחלקה ולהדפיס את דוח ספריית העובדים בדיוק בפורמט שמוצג למטה
לדוגמה, אם שם החברה הוא "TechCorp Solutions", נתוני העובדים כוללים את "EMP001" עם השם "Alice Johnson", המחלקה "Engineering", המשכורת 75000, הניסיון 5, את "EMP002" עם השם "Bob Smith", המחלקה "Marketing", המשכורת 60000, הניסיון 3, את "EMP003" עם השם "Carol Davis", המחלקה "Engineering", המשכורת 80000, הניסיון 7, ומזהה העובד לחיפוש הוא "EMP001", התוכנית שלכם צריכה להפיק:
Company: TechCorp Solutions
Employee Directory: {EMP001: {name: Alice Johnson, department: Engineering, salary: 75000, experience: 5}, EMP002: {name: Bob Smith, department: Marketing, salary: 60000, experience: 3}, EMP003: {name: Carol Davis, department: Engineering, salary: 80000, experience: 7}}
Employee Lookup (EMP001):
Name: Alice Johnson
Department: Engineering
Salary: $75000
Experience: 5 years
Department Analysis:
Engineering employees: 2
Marketing employees: 1
Total employees: 3
Average salary: $71666
Status: Employee directory processed successfullyאם שם החברה הוא "Global Industries", נתוני העובדים כוללים את "E100" עם השם "David Wilson", המחלקה "Sales", המשכורת 55000, הניסיון 4, את "E101" עם השם "Emma Brown", המחלקה "HR", המשכורת 65000, הניסיון 6, ומזהה העובד לחיפוש הוא "E101", התוכנית שלכם צריכה להפיק:
Company: Global Industries
Employee Directory: {E100: {name: David Wilson, department: Sales, salary: 55000, experience: 4}, E101: {name: Emma Brown, department: HR, salary: 65000, experience: 6}}
Employee Lookup (E101):
Name: Emma Brown
Department: HR
Salary: $65000
Experience: 6 years
Department Analysis:
Sales employees: 1
HR employees: 1
Total employees: 2
Average salary: $60000
Status: Employee directory processed successfullyאם שם החברה הוא "StartupHub", נתוני העובדים כוללים את "S001" עם השם "Frank Miller", המחלקה "Development", המשכורת 70000, הניסיון 2, את "S002" עם השם "Grace Lee", המחלקה "Design", המשכורת 58000, הניסיון 3, את "S003" עם השם "Henry Chen", המחלקה "Development", המשכורת 72000, הניסיון 4, את "S004" עם השם "Ivy Taylor", המחלקה "Marketing", המשכורת 62000, הניסיון 5, ומזהה העובד לחיפוש הוא "S003", התוכנית שלכם צריכה להפיק:
Company: StartupHub
Employee Directory: {S001: {name: Frank Miller, department: Development, salary: 70000, experience: 2}, S002: {name: Grace Lee, department: Design, salary: 58000, experience: 3}, S003: {name: Henry Chen, department: Development, salary: 72000, experience: 4}, S004: {name: Ivy Taylor, department: Marketing, salary: 62000, experience: 5}}
Employee Lookup (S003):
Name: Henry Chen
Department: Development
Salary: $72000
Experience: 4 years
Department Analysis:
Development employees: 2
Design employees: 1
Marketing employees: 1
Total employees: 4
Average salary: $65500
Status: Employee directory processed successfullyעל התוכנית שלכם ליצור מבנה Map מקונן, שבו המפה החיצונית משתמשת במזהי עובדים כמפתחות, וכל ערך הוא מפה פנימית שמכילה את "name", "department", "salary" ו-"experience" כמפתחות. השתמשו בגישה למפה מקוננת באמצעות סוגריים מרובעים כפולים כדי לקבל מידע על עובד מסוים. ספרו את העובדים בכל מחלקה וחשבו את המשכורת הממוצעת על ידי חלוקת סכום המשכורות הכולל במספר העובדים. פורמט הקלט יהיה: שם החברה, לאחר מכן קבוצות של חמישה ערכים (מזהה עובד, שם, מחלקה, משכורת, ניסיון) שמסתיימות ב-"employees_done", ולאחר מכן מזהה העובד לחיפוש.
נסו בעצמכם
import 'dart:io';
void main() {
// קרא את שם החברה
String? companyName = stdin.readLineSync();
// אתחל מפה מקוננת עבור ספר העובדים
Map<String, Map<String, dynamic>> employeeDirectory = {};
// קרא נתוני עובדים עד "employees_done"
while (true) {
String? input = stdin.readLineSync();
if (input == "employees_done") {
break;
}
String employeeId = input!;
String? name = stdin.readLineSync();
String? department = stdin.readLineSync();
String? salaryStr = stdin.readLineSync();
String? experienceStr = stdin.readLineSync();
// המר את השכר ואת שנות הניסיון למספרים שלמים
int salary = int.parse(salaryStr!);
int experience = int.parse(experienceStr!);
// TODO: צור מבנה מפה מקוננת לכל עובד והוסף אותו לספר העובדים
}
// קרא את מזהה העובד לחיפוש
String? lookupId = stdin.readLineSync();
// TODO: כתוב את הקוד שלך להלן כדי:
// 1. להציג את שם החברה ואת ספר העובדים
// 2. לחפש ולהציג מידע על עובד מסוים
// 3. לחשב נתונים סטטיסטיים לפי מחלקה
// 4. לחשב את השכר הממוצע
// 5. להדפיס את הדוח המלא בפורמט הנדרש
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
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 אונליין