Aktualizowanie wartości
Część sekcji Logika i przepływ programu ścieżki Rust w Coddy. Lekcja 32 z 66.
Czasami trzeba aktualizować wartości w mapie haszującej na różne sposoby. Wiesz już, że .insert() nadpisuje istniejącą wartość, ale co zrobić, jeśli chcesz dodać wartość tylko wtedy, gdy klucz jeszcze nie istnieje?
Rust udostępnia API .entry(), które umożliwia bardziej zaawansowane aktualizowanie wartości. Najbardziej przydatną metodą w tym API jest .or_insert(), która wstawia wartość tylko wtedy, gdy klucz jeszcze nie istnieje:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// To NIE nadpisze wyniku Alice
scores.entry("Alice").or_insert(90);
// To DODA wynik Bob, ponieważ nie ma go w mapie
scores.entry("Bob").or_insert(90);Metoda .entry() zwraca typ wyliczeniowy Entry, który reprezentuje zajęte lub wolne miejsce w mapie haszującej. Gdy wywołasz na nim .or_insert(), nowa wartość zostanie wstawiona tylko wtedy, gdy wpis jest wolny (klucz nie istnieje).
Wyzwanie
ŁatwyOtrzymasz liczbę całkowitą n, która określa liczbę nazw graczy do przetworzenia. Następnie otrzymasz jako dane wejściowe n nazw graczy. Utwórz mapę hashującą do śledzenia wyników graczy (typ HashMap<String, i32>). Dla każdej otrzymanej nazwy gracza użyj .entry() z .or_insert(), aby dodać ją do mapy z początkowym wynikiem 100 tylko wtedy, gdy jeszcze nie istnieje. Po przetworzeniu wszystkich nazw wypisz każdego gracza i jego wynik.
Wymagania:
- Zaimportuj
HashMapzstd::collections - Utwórz mutowalną mapę hashującą o typie
HashMap<String, i32> - Odczytaj pierwsze dane wejściowe i przekonwertuj je na
i32, aby uzyskać liczbę nazw graczy - Użyj pętli, aby odczytać
nnazw graczy - Dla każdej nazwy gracza użyj
.entry(name).or_insert(100), aby dodać go z wynikiem100, jeśli nie ma go jeszcze w mapie - Po przetworzeniu wszystkich nazw przeiteruj po mapie hashującej i wypisz informacje o każdym graczu w formacie:
[name]: [score]
Dane wejściowe:
- Pierwszy wiersz: liczba całkowita
n(np.5) - Kolejne
nwierszy: nazwy graczy (np.Alice,Bob,Alice,Charlie,Bob)
Dane wyjściowe:
- Jeden wiersz dla każdego unikalnego gracza w formacie:
[name]: [score] - Kolejność wierszy wyjściowych 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ę nazw graczy
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// Utwórz modyfikowalny HashMap do przechowywania wyników graczy
let mut player_scores: HashMap<String, i32> = HashMap::new();
// TODO: Napisz swój kod poniżej
// Odczytaj n nazw graczy i użyj .entry().or_insert(100), aby dodać je do mapy
// Wypisz każdego gracza i jego wynik w formacie: [name]: [score]
}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