הסרת זוג
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-Rust של Coddy. שיעור 33 מתוך 66.
לפעמים צריך להסיר נתונים מהמפה הגיבובית שלך לחלוטין. Rust מספקת את המתודה .remove() כדי למחוק זוג מפתח-ערך באמצעות ציון המפתח:
let mut inventory = HashMap::new();
inventory.insert("apples", 50);
inventory.insert("bananas", 30);
// הסר לחלוטין את הרשומה "apples"
inventory.remove("apples");השיטה .remove() מקבלת את המפתח כפרמטר ומסירה הן את המפתח והן את הערך המשויך אליו ממפת הגיבוב. לאחר קריאה ל־.remove("apples"), ניסיון לחפש את "apples" יחזיר None.
בדומה לפעולות רבות ב־hash map, הפעולה .remove() מחזירה Option. היא מחזירה Some(value) שמכיל את הערך שהוסר אם המפתח היה קיים, או None אם המפתח לא נמצא:
let removed_value = inventory.remove("bananas");
match removed_value {
Some(count) => println!("Removed {} bananas", count),
None => println!("No bananas found to remove"),
}ערך ההחזרה הזה מאפשר לך לדעת אם ההסרה הצליחה, ומעניק לך גישה לערך שהוסר, דבר שיכול להיות שימושי לרישום ביומן או לפעולות ניקוי.
אתגר
קלתקבלו מספר שלם n המציין את מספר הפריטים במלאי. לאחר מכן תקבלו n זוגות של קלטים: שם של פריט ולאחריו הכמות שלו (כמספר שלם). לאחר מכן תקבלו קלט נוסף עם שם של פריט להסרה מהמלאי. צרו מפת גיבוב לאחסון המלאי, הוסיפו את כל הפריטים, הסירו את הפריט שצוין והדפיסו את תוצאת ההסרה יחד עם המלאי שנותר.
דרישות:
- ייבאו את
HashMapמתוךstd::collections - צרו מפת גיבוב שניתנת לשינוי מהסוג
HashMap<String, i32> - קראו את הקלט הראשון והמירו אותו ל-
i32כדי לקבל את מספר הפריטים - השתמשו בלולאה כדי לקרוא
nזוגות של קלטים (שם הפריט, ואז הכמות) - הוסיפו כל פריט ואת הכמות שלו למפת הגיבוב
- קראו קלט נוסף בתור שם הפריט להסרה
- השתמשו ב-
.remove()כדי להסיר את הפריט ממפת הגיבוב - השתמשו ב-
matchכדי לטפל בערךOptionשמוחזר על ידי.remove() - אם הפריט נמצא והוסר, הדפיסו:
Removed [quantity] [item_name] - אם הפריט לא נמצא, הדפיסו:
[item_name] not found - לאחר הטיפול בהסרה, עברו על מפת הגיבוב שנותרה והדפיסו כל פריט בפורמט:
[item_name]: [quantity]
קלט:
- שורה ראשונה: מספר שלם
n(לדוגמה,3) nזוגות השורות הבאים:- שם הפריט (לדוגמה,
apples) - כמות כמספר שלם (לדוגמה,
50)
- שם הפריט (לדוגמה,
- שורה אחרונה: שם הפריט להסרה (לדוגמה,
bananas)
פלט:
- שורה ראשונה:
Removed [quantity] [item_name]או[item_name] not found - השורות הבאות: שורה אחת עבור כל פריט שנותר בפורמט:
[item_name]: [quantity] - הסדר של הפריטים שנותרו עשוי להשתנות בין הרצות של הבדיקות
נסו בעצמכם
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 inventory: HashMap<String, i32> = HashMap::new();
// קרא n זוגות של ערכי קלט (שם פריט וכמות)
for _ in 0..n {
let item_name = lines.next().unwrap().unwrap().trim().to_string();
let quantity: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// TODO: הכנס את הפריט והכמות למפת הגיבוב
}
// קרא את שם הפריט שיש להסיר
let item_to_remove = lines.next().unwrap().unwrap().trim().to_string();
// TODO: הסר את הפריט ממפת הגיבוב וטפל בתוצאה באמצעות match
// הדפס את תוצאת ההסרה (או "Removed [quantity] [item_name]" או "[item_name] not found")
// TODO: עבור על הפריטים שנותרו במלאי והדפס כל פריט בפורמט "[item_name]: [quantity]"
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
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 אונליין