Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Otrzymasz 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 HashMap z std::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ć n par 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ść Option zwracaną 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 n par wierszy:
    • Nazwa pozycji (np. apples)
    • Ilość jako liczba całkowita (np. 50)
  • 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]"
}
quiz iconSprawdź się

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

Poćwicz samodzielnie: Kompilator Rust online