Iterieren über eine Hash Map
Teil des Abschnitts Logic & Flow der Rust-Journey von Coddy — Lektion 31 von 66.
Manchmal müssen Sie jedes Schlüssel-Wert-Paar in Ihrer Hash-Map untersuchen, anstatt nach bestimmten Schlüsseln zu suchen. Rust bietet eine einfache Möglichkeit, mit einer for-Schleife durch alle Daten zu iterieren:
for (key, value) in &my_map {
println!("{}: {}", key, value);
}Beachten Sie das & vor my_map – dies erstellt eine Referenz auf die Hash-Map, sodass Sie iterieren können, ohne den Besitz zu übernehmen. Die Schleife gibt Ihnen jedes Schlüssel-Wert-Paar als Tupel zurück, das Sie direkt in der Schleifendeklaration destrukturieren können.
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 zu beachten: Hash-Maps garantieren keine bestimmte Iterationsreihenfolge. Die Paare könnten bei jedem Programmdurchlauf in einer anderen Reihenfolge ausgegeben werden. Dies liegt daran, dass Hash-Maps schnelle Suchvorgänge gegenüber der Beibehaltung der Einfügereihenfolge priorisieren. Verlassen Sie sich also beim Iterieren nicht darauf, dass die Elemente in einer bestimmten Reihenfolge erscheinen.
Aufgabe
EinfachSie erhalten eine Ganzzahl n, die die Anzahl der zu verarbeitenden Schüler-Ergebnis-Paare angibt. Danach erhalten Sie n Paare von Eingaben: einen Schülernamen gefolgt von dessen Testergebnis (als Ganzzahl). Erstellen Sie eine Hash-Map, um die Schülernamen als Schlüssel und ihre Ergebnisse als Werte zu speichern. Nachdem Sie alle Paare eingefügt haben, iterieren Sie über die Hash-Map und geben Sie den Namen und das Ergebnis jedes Schülers aus.
Anforderungen:
- Importieren Sie
HashMapausstd::collections - Erstellen Sie eine veränderbare Hash-Map mit den Typen
HashMap<String, i32> - Lesen Sie die erste Eingabe ein und konvertieren Sie diese in
i32, um die Anzahl der Paare zu erhalten - Verwenden Sie eine Schleife, um
nPaare von Eingaben zu lesen (Schülername, dann Ergebnis) - Fügen Sie jeden Schülernamen und jedes Ergebnis in die Hash-Map ein
- Verwenden Sie eine
for-Schleife, um mit&mapüber die Hash-Map zu iterieren - Geben Sie die Informationen jedes Schülers im Format
[name]: [score]aus - Geben Sie die Paare in beliebiger Reihenfolge aus (Hash-Maps garantieren keine Reihenfolge)
Eingabe:
- Erste Zeile: Eine Ganzzahl
n(z. B.3) - Nächste
nPaare von Zeilen:- Schülername (z. B.
Alice) - Testergebnis als Ganzzahl (z. B.
95)
- Schülername (z. B.
Ausgabe:
- Eine Zeile für jeden Schüler im Format:
[name]: [score] - Die Reihenfolge der Ausgabezeilen kann zwischen den Testläufen variieren
Spickzettel
Um über alle Schlüssel-Wert-Paare in einer Hash-Map zu iterieren, verwenden Sie eine for-Schleife mit einer Referenz auf die Map:
for (key, value) in &my_map {
println!("{}: {}", key, value);
}Das & vor der Hash-Map erstellt eine Referenz, was die Iteration ermöglicht, ohne den Besitz (Ownership) zu übernehmen. Die Schleife destrukturiert jedes Schlüssel-Wert-Paar als Tupel.
Beispiel mit einer Hash-Map:
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);
}Wichtig: Hash-Maps garantieren keine bestimmte Iterationsreihenfolge. Die Paare können bei jedem Programmdurchlauf in unterschiedlichen Sequenzen erscheinen, da Hash-Maps schnelle Suchvorgänge gegenüber der Beibehaltung der Einfügereihenfolge priorisieren.
Probier es selbst
use std::collections::HashMap;
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
let mut lines = stdin.lock().lines();
// Lies die Anzahl der Schüler-Punktzahl-Paare
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// Erstelle eine veränderbare Hash-Map, um Schülernamen und Punktzahlen zu speichern
let mut students: HashMap<String, i32> = HashMap::new();
// TODO: Schreibe deinen Code unten
// Lies n Paare von Eingaben (Schülername und Punktzahl) und füge sie in die Hash-Map ein
// TODO: Iteriere über die Hash-Map und gib den Namen und die Punktzahl jedes Schülers aus
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Fortgeschrittener Kontrollfluss
Der 'match'-AusdruckAbgleichen mehrerer WerteBereiche abgleichenDer 'if let'-AusdruckSchleifen als AusdrückeRückblick – Einfacher Befehls-Parser4Daten gruppieren mit Structs
Was ist ein Struct?Übersicht über StructsZugriff auf Struct-FelderVeränderbare StructsStructs als FunktionsparameterTupel-StructsZusammenfassung – Ein Buch-Struct erstellen2Einführung in Vektoren
Was ist ein Vektor?Einen Vektor erstellenElemente mit push hinzufügenZugriff auf Vektor-ElementeÜber einen Vektor iterierenVeränderliche IterationElemente entfernenZusammenfassung – Einfacher Score-Tracker5Schlüssel-Wert-Paare mit Hash Maps
Was ist eine Hash Map?Erstellen einer Hash MapEinfügen von Schlüssel-Wert-PaarenZugreifen auf WerteIterieren über eine Hash MapAktualisieren eines WertesEntfernen eines PaaresZusammenfassung – Wortzähler8Projekt: Einfaches Artikelinventar
Projekt-SetupEinen Artikel hinzufügenLagerbestand prüfenEinen Artikel verkaufenAlles zusammenfügen11Abschluss-Herausforderungen
Wiederholung - Einzigartige ElementeWiederholung - Benutzerprofil-ValidatorWiederholung - Noten-Zusammenfassung3Kommandozeilen-To-Do-Liste
Projekt-SetupEine Aufgabe hinzufügenAlle Aufgaben anzeigenEine Aufgabe entfernenFinaler Code