מעבר על מפת גיבוב
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 31 מתוך 66.
לפעמים צריך לבדוק כל זוג מפתח-ערך במפת הגיבוב שלך, במקום לחפש מפתחות מסוימים. Rust מספקת דרך פשוטה לעבור בלולאה על כל הנתונים באמצעות לולאת for:
for (key, value) in &my_map {
println!("{}: {}", key, value);
}שימו לב ל־& שלפני my_map — כך נוצרת הפניה למפת הגיבוב, כדי שתוכלו לבצע איטרציה בלי לקבל בעלות. הלולאה מספקת לכם כל זוג מפתח־ערך בתור טאפל, שאותו תוכלו לפרק ישירות בהצהרת הלולאה.
הנה דוגמה מעשית עם רשימת מחירים:
let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);
for (item, price) in &prices {
println!("{} costs ${:.2}", item, price);
}יש פרט חשוב אחד שכדאי לזכור: מפות גיבוב אינן מבטיחות סדר איטרציה מסוים. ייתכן שהזוגות יופיעו בכל פעם ברצף שונה כשתריצו את התוכנית. הסיבה לכך היא שמפות גיבוב נותנות עדיפות לחיפוש מהיר על פני שמירה על סדר ההוספה, לכן אל תסתמכו על כך שהפריטים יופיעו ברצף מסוים כשתעברו עליהם באיטרציה.
אתגר
קליתקבל מספר שלם n המציין את מספר זוגות השם והציון של התלמידים שיש לעבד. לאחר מכן יתקבלו n זוגות של קלט: שם של תלמיד ואחריו ציון המבחן שלו (כמספר שלם). יש ליצור מפת גיבוב לאחסון שמות התלמידים כמפתחות והציונים שלהם כערכים. לאחר הוספת כל הזוגות, יש לעבור על מפת הגיבוב ולהדפיס את שמו של כל תלמיד ואת הציון שלו.
דרישות:
- יש לייבא את
HashMapמתוךstd::collections - יש ליצור מפת גיבוב ניתנת לשינוי מהטיפוס
HashMap<String, i32> - יש לקרוא את הקלט הראשון ולהמיר אותו ל-
i32כדי לקבל את מספר הזוגות - יש להשתמש בלולאה כדי לקרוא
nזוגות של קלט (שם התלמיד, ואז הציון) - יש להוסיף כל שם של תלמיד ואת הציון שלו למפת הגיבוב
- יש להשתמש בלולאת
forכדי לעבור על מפת הגיבוב באמצעות&map - יש להדפיס את הפרטים של כל תלמיד בפורמט:
[name]: [score] - יש להדפיס את הזוגות בכל סדר שהוא (מפות גיבוב אינן מבטיחות סדר)
קלט:
- שורה ראשונה: מספר שלם
n(לדוגמה,3) - לאחר מכן
nזוגות של שורות:- שם התלמיד (לדוגמה,
Alice) - ציון המבחן כמספר שלם (לדוגמה,
95)
- שם התלמיד (לדוגמה,
פלט:
- שורה אחת לכל תלמיד בפורמט:
[name]: [score] - סדר שורות הפלט עשוי להשתנות בין הרצות בדיקה
נסו בעצמכם
use std::collections::HashMap;
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// קרא את מספר הזוגות של תלמיד וציון
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// צור מפת גיבוב ניתנת לשינוי לאחסון שמות התלמידים והציונים שלהם
let mut students: HashMap<String, i32> = HashMap::new();
// TODO: כתוב את הקוד שלך למטה
// קרא n זוגות של נתוני קלט (שם תלמיד וציון) והכנס אותם למפת הגיבוב
// TODO: עבור על מפת הגיבוב והדפס את השם והציון של כל תלמיד
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1זרימת בקרה מתקדמת
ביטוי 'match'התאמה למספר ערכיםהתאמה לטווחיםביטוי 'if let'לולאות כביטוייםסיכום – מנתח פקודות פשוט4קיבוץ נתונים באמצעות מבנים
מהו מבנה?סקירה כללית על מבניםגישה לשדות במבנהמבנים הניתנים לשינוימבנים כפרמטרים של פונקציהמבני טופלסיכום – יצירת מבנה ספר7טיפול בשגיאות באמצעות 'Result'
מהו 'Result'?שימוש ב-'match' עם 'Result'is_ok() ו-is_err()קיצורי דרך: unwrap ו-expectאופרטור סימן השאלה '?'המרת מחרוזות למספריםסיכום - פונקציית חילוק בטוחה10Closures ופונקציות אנונימיות
מהו Closure?הגדרת Closure פשוטClosures עם פרמטריםלכידת הסביבהסיכום – Closure פשוט לחיבור2מבוא לווקטורים
מהו וקטור?יצירת וקטורהוספת איברים באמצעות pushגישה לאיברי וקטורמעבר על וקטורמעבר ניתן לשינויהסרת איבריםסיכום – מעקב בסיסי אחר ניקוד5זוגות מפתח-ערך באמצעות מפות גיבוב
מהי מפת גיבוב?יצירת מפת גיבובהוספת זוגות מפתח-ערךגישה לערכיםמעבר על מפת גיבובעדכון ערךהסרת זוגסיכום – מונה מיליםתרגלו בעצמכם: קומפיילר Rust אונליין