Menu
Coddy logo textTech

Iterieren über eine Hash Map

Teil des Abschnitts Logik & Kontrollfluss der Rust-Journey von Coddy. Lektion 31 von 66.

Manchmal musst du jedes Schlüssel-Wert-Paar in deiner hash map untersuchen, anstatt nach bestimmten Schlüsseln zu suchen. Rust bietet eine einfache Möglichkeit, alle Daten mithilfe einer for-Schleife zu durchlaufen:

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

Beachte das & vor my_map – dadurch wird eine Referenz auf die Hash-Map erstellt, sodass du iterieren kannst, ohne den Besitz zu übernehmen. Die Schleife liefert dir jedes Schlüssel-Wert-Paar als Tupel, das du direkt in der Schleifendeklaration destrukturieren kannst.

Hier ist ein praktisches Beispiel mit einer Preisliste:

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);
}

Es gibt ein wichtiges Detail, das du dir merken solltest: Hash-Maps garantieren keine bestimmte Iterationsreihenfolge. Die Paare können bei jedem Ausführen deines Programms in einer anderen Reihenfolge ausgegeben werden. Das liegt daran, dass Hash-Maps schnelle Suchvorgänge höher priorisieren als die Beibehaltung der Einfügereihenfolge. Verlass dich daher beim Iterieren nicht darauf, dass die Elemente in einer bestimmten Reihenfolge erscheinen.

challenge icon

Aufgabe

Einfach

Du erhältst eine ganze Zahl n, die die Anzahl der zu verarbeitenden Schüler-Leistungs-Paare angibt. Anschließend erhältst du n Eingabepaare: einen Schülernamen, gefolgt von dessen Testergebnis (als ganze Zahl). Erstelle eine Hash-Map, um die Schülernamen als Schlüssel und ihre Ergebnisse als Werte zu speichern. Nachdem du alle Paare eingefügt hast, durchlaufe die Hash-Map und gib den Namen und das Ergebnis jedes Schülers aus.

Anforderungen:

  • Importiere HashMap aus std::collections
  • Erstelle eine veränderliche Hash-Map mit den Typen HashMap<String, i32>
  • Lies die erste Eingabe ein und konvertiere sie in i32, um die Anzahl der Paare zu erhalten
  • Verwende eine Schleife, um n Eingabepaare einzulesen (Schülername, dann Ergebnis)
  • Füge jeden Schülernamen und sein Ergebnis in die Hash-Map ein
  • Verwende eine for-Schleife, um die Hash-Map mit &map zu durchlaufen
  • Gib die Informationen jedes Schülers im Format [name]: [score] aus
  • Gib die Paare in beliebiger Reihenfolge aus (Hash-Maps garantieren keine Reihenfolge)

Eingabe:

  • Erste Zeile: Eine ganze Zahl n (z. B. 3)
  • Die nächsten n Zeilenpaare:
    • Schülername (z. B. Alice)
    • Testergebnis als ganze Zahl (z. B. 95)

Ausgabe:

  • Eine Zeile für jeden Schüler im Format: [name]: [score]
  • Die Reihenfolge der Ausgabezeilen kann zwischen Testläufen variieren

Probier es selbst

use std::collections::HashMap;
use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    let mut lines = stdin.lock().lines();
    
    // Lese die Anzahl der Schüler-Punkte-Paare
    let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
    
    // Erstelle eine veränderbare HashMap, um Schülernamen und Punktzahlen zu speichern
    let mut students: HashMap<String, i32> = HashMap::new();
    
    // TODO: Schreibe deinen Code darunter
    // Lese n Eingabepaare (Schülername und Punktzahl) und füge sie in die HashMap ein
    
    
    
    // TODO: Iteriere über die HashMap und gib Name und Punktzahl jedes Schülers aus
    
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Kontrollfluss

Übe selbstständig: Online-Rust-Compiler