Menu
Coddy logo textTech

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).

challenge icon

Wyzwanie

Łatwy

Otrzymasz 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 HashMap z std::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ć n nazw graczy
  • Dla każdej nazwy gracza użyj .entry(name).or_insert(100), aby dodać go z wynikiem 100, 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 n wierszy: 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]
    
}
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