Menu
Coddy logo textTech

מאפייני 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() אם דרושה לך פונקציונליות ייחודית לרשימות. ההפרדה הזאת בין המפתחות לערכים מועילה במיוחד כשצריך לנתח או לשנות היבט אחד של הנתונים בנפרד מההיבט האחר.

challenge icon

אתגר

קל

צרו תוכנית שמנהלת מערכת של ספרייה דיגיטלית באמצעות ניתוח אוספי ספרים וחילוץ מידע על כותרים ושנות פרסומם. התוכנית שלכם צריכה:

  1. לקרוא קלט מסוג מחרוזת שמייצג את שם הספרייה
  2. לקרוא כמה זוגות של ערכי קלט שמייצגים כותרי ספרים ואת שנות פרסומם (הקלט יסתיים כשתקבלו "catalog_done")
  3. ליצור Map שבו כותר כל ספר ישמש כמפתח ושנת הפרסום שלו תשמש כערך
  4. להשתמש במאפיין .keys כדי לחלץ את כל כותרי הספרים ולהמיר אותם ל-List
  5. להשתמש במאפיין .values כדי לחלץ את כל שנות הפרסום ולהמיר אותן ל-List
  6. למצוא את הספר הישן ביותר באמצעות זיהוי השנה המינימלית מבין הערכים
  7. למצוא את הספר החדש ביותר באמצעות זיהוי השנה המקסימלית מבין הערכים
  8. להדפיס את ניתוח הספרייה בדיוק בתבנית שמוצגת בהמשך

לדוגמה, אם שם הספרייה הוא "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:");
  // הוסיפו כאן את פקודות הפלט שלכם
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

תרגלו בעצמכם: קומפיילר Dart אונליין