מאפייני Map: מפתחות וערכים
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Dart של Coddy. שיעור 28 מתוך 65.
כשעובדים עם אוספי Map, לפעמים צריך לחלץ בנפרד את כל המפתחות או את כל הערכים. Dart מספקת שתי תכונות נוחות לשם כך: .keys ו־.values.
המאפיין .keys מחזיר אובייקט שניתן לאיטרציה שמכיל את כל המפתחות מהמפה, בעוד ש-.values מחזיר אובייקט שניתן לאיטרציה שמכיל את כל הערכים המתאימים. המאפיינים האלה שימושיים במיוחד כשצריך לעבד מפתחות וערכים בנפרד.
Map<String, double> inventory = {
'Laptop': 999.99,
'Mouse': 25.50,
'Keyboard': 75.00
};
Iterable<String> productNames = inventory.keys;
Iterable<double> prices = inventory.values;
print(productNames); // (Laptop, Mouse, Keyboard)
print(prices); // (999.99, 25.5, 75.0)מכיוון שהמאפיינים האלה מחזירים אובייקטים שניתנים לאיטרציה ולא רשימות, אפשר להמיר אותם לרשימות באמצעות .toList() אם דרושה לך פונקציונליות ייחודית לרשימות. ההפרדה הזאת בין המפתחות לערכים מועילה במיוחד כשצריך לנתח או לשנות היבט אחד של הנתונים בנפרד מההיבט האחר.
אתגר
קלצרו תוכנית שמנהלת מערכת של ספרייה דיגיטלית באמצעות ניתוח אוספי ספרים וחילוץ מידע על כותרים ושנות פרסומם. התוכנית שלכם צריכה:
- לקרוא קלט מסוג מחרוזת שמייצג את שם הספרייה
- לקרוא כמה זוגות של ערכי קלט שמייצגים כותרי ספרים ואת שנות פרסומם (הקלט יסתיים כשתקבלו
"catalog_done") - ליצור Map שבו כותר כל ספר ישמש כמפתח ושנת הפרסום שלו תשמש כערך
- להשתמש במאפיין
.keysכדי לחלץ את כל כותרי הספרים ולהמיר אותם ל-List - להשתמש במאפיין
.valuesכדי לחלץ את כל שנות הפרסום ולהמיר אותן ל-List - למצוא את הספר הישן ביותר באמצעות זיהוי השנה המינימלית מבין הערכים
- למצוא את הספר החדש ביותר באמצעות זיהוי השנה המקסימלית מבין הערכים
- להדפיס את ניתוח הספרייה בדיוק בתבנית שמוצגת בהמשך
לדוגמה, אם שם הספרייה הוא "Central Library" והקטלוג כולל את "To Kill a Mockingbird" עם השנה 1960, את "1984" עם השנה 1949, את "The Great Gatsby" עם השנה 1925, ואת "Harry Potter" עם השנה 1997, התוכנית שלכם אמורה להציג:
Library: Central Library
Book Collection Analysis:
All book titles: [To Kill a Mockingbird, 1984, The Great Gatsby, Harry Potter]
All publication years: [1960, 1949, 1925, 1997]
Total books in collection: 4
Oldest book year: 1925
Newest book year: 1997
Collection span: 72 years
Status: Library catalog analysis completedאם שם הספרייה הוא "University Library" והקטלוג כולל את "Pride and Prejudice" עם השנה 1813, את "Moby Dick" עם השנה 1851, ואת "Brave New World" עם השנה 1932, התוכנית שלכם אמורה להציג:
Library: University Library
Book Collection Analysis:
All book titles: [Pride and Prejudice, Moby Dick, Brave New World]
All publication years: [1813, 1851, 1932]
Total books in collection: 3
Oldest book year: 1813
Newest book year: 1932
Collection span: 119 years
Status: Library catalog analysis completedאם שם הספרייה הוא "Community Library" והקטלוג כולל את "The Hobbit" עם השנה 1937, את "Dune" עם השנה 1965, את "Neuromancer" עם השנה 1984, את "The Martian" עם השנה 2011, ואת "Klara and the Sun" עם השנה 2021, התוכנית שלכם אמורה להציג:
Library: Community Library
Book Collection Analysis:
All book titles: [The Hobbit, Dune, Neuromancer, The Martian, Klara and the Sun]
All publication years: [1937, 1965, 1984, 2011, 2021]
Total books in collection: 5
Oldest book year: 1937
Newest book year: 2021
Collection span: 84 years
Status: Library catalog analysis completedהתוכנית שלכם חייבת להשתמש במאפיין .keys כדי לחלץ את כל כותרי הספרים ובמאפיין .values כדי לחלץ את כל שנות הפרסום. המירו את שתי הסדרות ל-List באמצעות .toList(). חשבו את טווח האוסף על ידי הפחתת השנה העתיקה ביותר מהשנה החדשה ביותר. פורמט הקלט יהיה: שם הספרייה, ולאחריו כותרי ספרים ושנות פרסום לסירוגין (כמחרוזות שצריך להמיר למספרים שלמים), ולבסוף "catalog_done".
נסו בעצמכם
import 'dart:io';
void main() {
// קראו את שם הספרייה
String? libraryName = stdin.readLineSync();
// צרו Map לאחסון שמות הספרים ושנות הפרסום
Map<String, int> bookCatalog = {};
// קראו שמות ספרים ושנות פרסום עד "catalog_done"
while (true) {
String? input = stdin.readLineSync();
if (input == "catalog_done") {
break;
}
String bookTitle = input!;
String? yearInput = stdin.readLineSync();
int publicationYear = int.parse(yearInput!);
bookCatalog[bookTitle] = publicationYear;
}
// TODO: כתבו את הקוד שלכם למטה
// חלצו את שמות הספרים באמצעות המאפיין .keys והמירו אותם ל-List
// חלצו את שנות הפרסום באמצעות המאפיין .values והמירו אותן ל-List
// מצאו את שנת הפרסום המוקדמת ביותר ואת המאוחרת ביותר
// חשבו את טווח השנים של האוסף
// הדפיסו את ניתוח הספרייה בפורמט הנדרש
print("Library: $libraryName");
print("Book Collection Analysis:");
// הוסיפו כאן את פקודות הפלט שלכם
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
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 אונליין