Usuwanie pary
Część sekcji Logika i przepływ programu ścieżki Rust w Coddy. Lekcja 33 z 66.
Czasami trzeba całkowicie usunąć dane z mapy hashującej. Rust udostępnia metodę .remove(), która usuwa parę klucz-wartość po podaniu klucza:
let mut inventory = HashMap::new();
inventory.insert("apples", 50);
inventory.insert("bananas", 30);
// Usuń całkowicie wpis "apples"
inventory.remove("apples");Metoda .remove() przyjmuje klucz jako parametr i usuwa zarówno klucz, jak i powiązaną z nim wartość z mapy haszującej. Po wywołaniu .remove("apples") próba wyszukania „apples” zwróci None.
Podobnie jak wiele operacji na mapach haszujących, .remove() zwraca Option. Zwraca Some(value) zawierające usuniętą wartość, jeśli klucz istniał, lub None, jeśli nie znaleziono klucza:
let removed_value = inventory.remove("bananas");
match removed_value {
Some(count) => println!("Removed {} bananas", count),
None => println!("No bananas found to remove"),
}Ta wartość zwracana informuje, czy usunięcie się powiodło, i zapewnia dostęp do usuniętej wartości, co może być przydatne podczas rejestrowania zdarzeń lub operacji porządkowych.
Wyzwanie
ŁatwyOtrzymasz liczbę całkowitą n określającą liczbę pozycji w magazynie. Następnie otrzymasz n par danych wejściowych: nazwę pozycji, a po niej jej ilość (jako liczbę całkowitą). Potem otrzymasz jeszcze jedną daną wejściową z nazwą pozycji do usunięcia z magazynu. Utwórz mapę mieszającą do przechowywania zawartości magazynu, wstaw wszystkie pozycje, usuń wskazaną pozycję i wyświetl wynik usuwania wraz z pozostałą zawartością magazynu.
Wymagania:
- Zaimportuj
HashMapzstd::collections - Utwórz mutowalną mapę mieszającą o typie
HashMap<String, i32> - Odczytaj pierwszą daną wejściową i przekonwertuj ją na
i32, aby uzyskać liczbę pozycji - Użyj pętli, aby odczytać
npar danych wejściowych (nazwa pozycji, a następnie ilość) - Wstaw każdą pozycję i jej ilość do mapy mieszającej
- Odczytaj jeszcze jedną daną wejściową jako nazwę pozycji do usunięcia
- Użyj
.remove(), aby usunąć pozycję z mapy mieszającej - Użyj
match, aby obsłużyć wartośćOptionzwracaną przez.remove() - Jeśli pozycja została znaleziona i usunięta, wyświetl:
Removed [quantity] [item_name] - Jeśli pozycja nie została znaleziona, wyświetl:
[item_name] not found - Po obsłużeniu usuwania przeiteruj po pozostałej mapie mieszającej i wyświetl każdą pozycję w formacie:
[item_name]: [quantity]
Dane wejściowe:
- Pierwszy wiersz: liczba całkowita
n(np.3) - Następnie
npar wierszy:- Nazwa pozycji (np.
apples) - Ilość jako liczba całkowita (np.
50)
- Nazwa pozycji (np.
- Ostatni wiersz: nazwa pozycji do usunięcia (np.
bananas)
Dane wyjściowe:
- Pierwszy wiersz: albo
Removed [quantity] [item_name], albo[item_name] not found - Kolejne wiersze: po jednym wierszu dla każdej pozostałej pozycji w formacie:
[item_name]: [quantity] - Kolejność pozostałych pozycji może się różnić między uruchomieniami testów
Spróbuj swoich sił
use std::collections::HashMap;
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// Odczytaj liczbę przedmiotów
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// Utwórz modyfikowalną mapę haszującą do przechowywania stanu magazynowego
let mut inventory: HashMap<String, i32> = HashMap::new();
// Odczytaj n par danych wejściowych (nazwę przedmiotu i ilość)
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: Wstaw przedmiot i jego ilość do mapy haszującej
}
// Odczytaj nazwę przedmiotu do usunięcia
let item_to_remove = lines.next().unwrap().unwrap().trim().to_string();
// TODO: Usuń przedmiot z mapy haszującej i obsłuż wynik za pomocą match
// Wypisz wynik usunięcia (albo "Removed [quantity] [item_name]", albo "[item_name] not found")
// TODO: Przejdź po pozostałych przedmiotach w magazynie i wypisz każdy w formacie "[item_name]: [quantity]"
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Zaawansowane sterowanie przepływem
Wyrażenie „match”Dopasowywanie wielu wartościDopasowywanie zakresówWyrażenie „if let”Pętle jako wyrażeniaPodsumowanie — prosty parser poleceń4Grupowanie danych za pomocą struktur
Czym jest struktura?Przegląd strukturDostęp do pól strukturyModyfikowalne strukturyStruktury jako parametry funkcjiStruktury krotkowePodsumowanie — utwórz strukturę Book2Wprowadzenie do wektorów
Czym jest wektor?Tworzenie wektoraDodawanie elementów za pomocą pushDostęp do elementów wektoraIterowanie po wektorzeIterowanie z możliwością modyfikacjiUsuwanie elementówPodsumowanie — prosty licznik punktów5Pary klucz–wartość z mapami hashującymi
Czym jest mapa haszująca?Tworzenie mapy haszującejWstawianie par klucz–wartośćDostęp do wartościIterowanie po mapie haszującejAktualizowanie wartościUsuwanie paryPodsumowanie – licznik słów8Projekt: Prosty system inwentaryzacji
Konfiguracja projektuDodawanie produktuSprawdzanie stanu magazynowegoSprzedaż produktuŁączenie wszystkiego w całość3Lista zadań w wierszu poleceń
Konfiguracja projektuDodawanie zadaniaWyświetlanie wszystkich zadańUsuwanie zadaniaKońcowy kodPoćwicz samodzielnie: Kompilator Rust online