עדכון ערך
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 32 מתוך 66.
לפעמים צריך לעדכן ערכים במפת גיבוב בדרכים שונות. כבר למדת ש-.insert() יחליף ערך קיים, אבל מה אם רוצים להוסיף ערך רק כשהמפתח עדיין לא קיים?
Rust מספקת את ממשק ה-API .entry() לעדכוני ערכים מתוחכמים יותר. השיטה השימושית ביותר בממשק API זה היא .or_insert(), שמכניסה ערך רק אם המפתח עדיין לא קיים:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// פעולה זו לא תדרוס את הניקוד של Alice
scores.entry("Alice").or_insert(90);
// פעולה זו כן תוסיף את הניקוד של Bob, כי הוא עדיין לא נמצא במפה
scores.entry("Bob").or_insert(90);המתודה .entry() מחזירה enum בשם Entry שמייצג מקום תפוס או פנוי במפת הגיבוב. כשקוראים לה עם .or_insert(), היא מוסיפה את הערך החדש רק אם הרשומה פנויה (המפתח לא קיים).
אתגר
קלתקבל מספר שלם n המציין את מספר שמות השחקנים שיש לעבד. לאחר מכן תקבל n שמות שחקנים כקלט. צור מפת גיבוב למעקב אחר ניקוד השחקנים (מהסוג HashMap<String, i32>). עבור כל שם שחקן שתקבל, השתמש ב-.entry() עם .or_insert() כדי להוסיף אותו למפה עם ניקוד התחלתי של 100 רק אם הוא עדיין לא מופיע בה. לאחר עיבוד כל השמות, הדפס כל שחקן ואת הניקוד שלו.
דרישות:
- ייבא את
HashMapמתוךstd::collections - צור מפת גיבוב ניתנת לשינוי עם הסוגים
HashMap<String, i32> - קרא את הקלט הראשון והמר אותו ל-
i32כדי לקבל את מספר שמות השחקנים - השתמש בלולאה כדי לקרוא
nשמות שחקנים - עבור כל שם שחקן, השתמש ב-
.entry(name).or_insert(100)כדי להוסיף אותו עם ניקוד של100אם הוא עדיין לא נמצא במפה - לאחר עיבוד כל השמות, עבור על מפת הגיבוב והדפס את המידע של כל שחקן בפורמט:
[name]: [score]
קלט:
- שורה ראשונה: מספר שלם
n(לדוגמה,5) nהשורות הבאות: שמות שחקנים (לדוגמה,Alice,Bob,Alice,Charlie,Bob)
פלט:
- שורה אחת עבור כל שחקן ייחודי בפורמט:
[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();
// צרו HashMap שניתן לשינוי כדי לאחסן את ניקוד השחקנים
let mut player_scores: HashMap<String, i32> = HashMap::new();
// TODO: כתבו את הקוד שלכם למטה
// קראו n שמות שחקנים והשתמשו ב-.entry().or_insert(100) כדי להוסיף אותם למפה
// הדפיסו כל שחקן ואת הניקוד שלו בפורמט: [name]: [score]
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
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 אונליין