Menu
Coddy logo textTech

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

challenge icon

Aufgabe

Einfach

Sie 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 HashMap aus std::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 n Spielernamen einzulesen
  • Verwenden Sie für jeden Spielernamen .entry(name).or_insert(100), um ihn mit einem Punktestand von 100 hinzuzufü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 n Zeilen: 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
    
}
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 Logic & Flow