Aktualisieren eines Wertes
Teil des Abschnitts Logic & Flow der Rust-Journey von Coddy — Lektion 32 von 66.
Manchmal müssen Sie Werte in einer Hash-Map auf unterschiedliche Weise aktualisieren. Sie haben bereits gelernt, dass .insert() einen vorhandenen Wert überschreibt, aber was ist, wenn Sie einen Wert nur hinzufügen möchten, wenn der Schlüssel noch nicht existiert?
Rust bietet die .entry() API für anspruchsvollere Wertaktualisierungen. Die nützlichste Methode in dieser API ist .or_insert(), die nur dann einen Wert einfügt, wenn der Schlüssel noch nicht vorhanden ist:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// Dies wird Alices Punktzahl NICHT überschreiben
scores.entry("Alice").or_insert(90);
// Dies WIRD Bobs Punktzahl hinzufügen, da er nicht in der Map ist
scores.entry("Bob").or_insert(90);Die Methode .entry() gibt ein Entry-Enum zurück, das entweder eine belegte oder eine freie Stelle in der Hash-Map darstellt. Wenn Sie .or_insert() darauf aufrufen, wird der neue Wert nur eingefügt, wenn der Eintrag leer ist (der Schlüssel existiert nicht).
Aufgabe
EinfachSie erhalten eine Ganzzahl n, die die Anzahl der zu verarbeitenden Spielernamen angibt. Danach erhalten Sie n Spielernamen als Eingaben. Erstellen Sie eine Hash-Map, um die Spielstände der Spieler zu verfolgen (Typ HashMap<String, i32>). Verwenden Sie für jeden erhaltenen Spielernamen .entry() mit .or_insert(), um sie mit einem Anfangsstand von 100 zur Map hinzuzufügen, sofern sie noch nicht existieren. Nachdem alle Namen verarbeitet wurden, geben Sie jeden Spieler und seinen Punktestand aus.
Anforderungen:
- Importieren Sie
HashMapausstd::collections - Erstellen Sie eine veränderbare (mutable) Hash-Map mit den Typen
HashMap<String, i32> - Lesen Sie die erste Eingabe und konvertieren Sie diese in
i32, um die Anzahl der Spielernamen zu erhalten - Verwenden Sie eine Schleife, um
nSpielernamen einzulesen - Verwenden Sie für jeden Spielernamen
.entry(name).or_insert(100), um ihn mit einem Punktestand von100hinzuzufügen, falls er noch nicht in der Map enthalten ist - Iterieren Sie nach der Verarbeitung aller Namen über die Hash-Map und geben Sie die Informationen jedes Spielers im Format
[name]: [score]aus
Eingabe:
- Erste Zeile: Eine Ganzzahl
n(z. B.5) - Nächste
nZeilen: Spielernamen (z. B.Alice,Bob,Alice,Charlie,Bob)
Ausgabe:
- Eine Zeile für jeden eindeutigen Spieler im Format:
[name]: [score] - Die Reihenfolge der Ausgabezeilen kann zwischen den Testläufen variieren
Spickzettel
Die .entry()-API bietet anspruchsvolle Möglichkeiten, Hash-Map-Werte zu aktualisieren. Die .or_insert()-Methode fügt nur dann einen Wert ein, wenn der Schlüssel noch nicht existiert:
let mut scores = HashMap::new();
scores.insert("Alice", 85);
// Dies wird Alices Punktzahl NICHT überschreiben
scores.entry("Alice").or_insert(90);
// Dies WIRD Bobs Punktzahl hinzufügen, da er nicht in der Map ist
scores.entry("Bob").or_insert(90);Die .entry()-Methode gibt ein Entry-Enum zurück, das entweder einen belegten oder einen freien Platz in der Hash-Map darstellt. Wenn Sie .or_insert() aufrufen, wird der neue Wert nur eingefügt, wenn der Eintrag leer ist (der Schlüssel also nicht existiert).
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 Spielernamen
let n: i32 = lines.next().unwrap().unwrap().trim().parse().unwrap();
// Erstelle eine veränderbare HashMap, um die Spielergebnisse zu speichern
let mut player_scores: HashMap<String, i32> = HashMap::new();
// TODO: Schreibe deinen Code unten
// Lies n Spielernamen und verwende .entry().or_insert(100), um sie der Map hinzuzufügen
// Gib jeden Spieler und sein Ergebnis im Format: [Name]: [Ergebnis] 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