Menu
Coddy logo textTech

Iterowanie po mapie haszującej

Część sekcji Logika i przepływ programu ścieżki Rust w Coddy. Lekcja 31 z 66.

Czasami musisz przejrzeć każdą parę klucz-wartość w swojej mapie haszującej, zamiast wyszukiwać konkretne klucze. Rust udostępnia prosty sposób iterowania po wszystkich danych za pomocą pętli for:

for (key, value) in &my_map {
    println!("{}: {}", key, value);
}

Zwróć uwagę na & przed my_map — tworzy on referencję do mapy haszującej, dzięki czemu możesz iterować bez przejmowania własności. Pętla przekazuje każdą parę klucz-wartość jako krotkę, którą możesz bezpośrednio rozpakować w deklaracji pętli.

Oto praktyczny przykład z cennikiem:

let mut prices = HashMap::new();
prices.insert("apple", 1.20);
prices.insert("banana", 0.80);

for (item, price) in &prices {
    println!("{} costs ${:.2}", item, price);
}

Jest jeden ważny szczegół, o którym warto pamiętać: mapy haszujące nie gwarantują żadnej konkretnej kolejności iteracji. Pary mogą pojawiać się w innej kolejności za każdym razem, gdy uruchomisz program. Dzieje się tak, ponieważ mapy haszujące stawiają szybkie wyszukiwanie ponad zachowanie kolejności wstawiania, więc podczas iteracji nie polegaj na tym, że elementy pojawią się w określonej kolejności.

challenge icon

Wyzwanie

Łatwy

Otrzymasz liczbę całkowitą n, która określa liczbę par: uczeń–wynik, które należy przetworzyć. Następnie otrzymasz n par danych wejściowych: imię ucznia, a po nim jego wynik testu (jako liczbę całkowitą). Utwórz mapę hashującą, aby przechowywać imiona uczniów jako klucze, a ich wyniki jako wartości. Po wstawieniu wszystkich par przeiteruj po mapie hashującej i wypisz imię każdego ucznia oraz jego wynik.

Wymagania:

  • Zaimportuj HashMap z std::collections
  • Utwórz mutowalną mapę hashującą o typie HashMap<String, i32>
  • Odczytaj pierwszą wartość wejściową i przekonwertuj ją na i32, aby uzyskać liczbę par
  • Użyj pętli, aby odczytać n par danych wejściowych (imię ucznia, a następnie wynik)
  • Wstaw imię i wynik każdego ucznia do mapy hashującej
  • Użyj pętli for, aby iterować po mapie hashującej za pomocą &map
  • Wypisz informacje o każdym uczniu w formacie: [name]: [score]
  • Wypisz pary w dowolnej kolejności (mapy hashujące nie gwarantują kolejności)

Dane wejściowe:

  • Pierwszy wiersz: liczba całkowita n (np. 3)
  • Następnie n par wierszy:
    • Imię ucznia (np. Alice)
    • Wynik testu jako liczba całkowita (np. 95)

Dane wyjściowe:

  • Jeden wiersz dla każdego ucznia 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();
    
    // Wczytaj liczbę par uczeń–wynik
    let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
    
    // Utwórz modyfikowalną mapę haszującą do przechowywania imion uczniów i ich wyników
    let mut students: HashMap<String, i32> = HashMap::new();
    
    // TODO: Napisz swój kod poniżej
    // Wczytaj n par danych wejściowych (imię ucznia i wynik) i dodaj je do mapy haszującej
    
    
    
    // TODO: Przejdź po mapie haszującej i wypisz imię oraz wynik każdego ucznia
    
}
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