Rust HashMap - Tutorial zur Datenspeicherung

RustRustBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen wir über HashMap in Rust, das verwendet wird, um Werte nach Schlüssel zu speichern. HashMap-Schlüssel können verschiedene Typen haben, darunter Booleans, Integer, Strings oder jeder andere Typ, der das Eq- und Hash-Trait implementiert. HashMaps können sich dynamisch in Abhängigkeit von der Anzahl der Elemente erweitern und verkleinern. Wir können ein HashMap mit einer bestimmten Kapazität mit HashMap::with_capacity(uint) erstellen oder HashMap::new() verwenden, um ein HashMap mit einer standardmäßigen Anfangskapazität zu erhalten. Das bereitgestellte Codebeispiel demonstriert die Verwendung von HashMap, indem Kontaktnamen und Telefonnummern gespeichert werden und Operationen wie das Einfügen, Abrufen, Ändern und Entfernen durchgeführt werden.

Hinweis: Wenn das Lab keinen Dateinamen angibt, können Sie einen beliebigen Dateinamen verwenden. Beispielsweise können Sie main.rs verwenden und es mit rustc main.rs &&./main kompilieren und ausführen.

HashMap

Während Vektoren Werte anhand eines ganzzahligen Index speichern, speichern HashMaps Werte nach Schlüssel. HashMap-Schlüssel können Booleans, Integer, Strings oder jeder andere Typ sein, der das Eq- und Hash-Trait implementiert. Mehr dazu im nächsten Abschnitt.

Wie Vektoren sind HashMaps wächstbar, aber HashMaps können sich auch selbst verkleinern, wenn sie zu viel Speicherplatz haben. Sie können ein HashMap mit einer bestimmten Anfangskapazität mit HashMap::with_capacity(uint) erstellen oder HashMap::new() verwenden, um ein HashMap mit einer standardmäßigen Anfangskapazität zu erhalten (empfohlen).

use std::collections::HashMap;

fn call(number: &str) -> &str {
    match number {
        "798-1364" => "Wir bitten um Entschuldigung, der Anruf kann nicht wie gewählt durchgeführt werden. Bitten Sie, aufzuhängen und erneut zu versuchen.",
        "645-7689" => "Hallo, das ist Mr. Awesome's Pizza. Mein Name ist Fred. Was kann ich für Sie tun?",
        _ => "Hi! Wer ist das nochmal?"
    }
}

fn main() {
    let mut contacts = HashMap::new();

    contacts.insert("Daniel", "798-1364");
    contacts.insert("Ashley", "645-7689");
    contacts.insert("Katie", "435-8291");
    contacts.insert("Robert", "956-1745");

    // Nimmt eine Referenz und gibt Option<&V> zurück
    match contacts.get(&"Daniel") {
        Some(&number) => println!("Rufe Daniel an: {}", call(number)),
        _ => println!("Habe Daniels Nummer nicht."),
    }

    // `HashMap::insert()` gibt `None` zurück,
    // wenn der eingefügte Wert neu ist, `Some(value)` andernfalls
    contacts.insert("Daniel", "164-6743");

    match contacts.get(&"Ashley") {
        Some(&number) => println!("Rufe Ashley an: {}", call(number)),
        _ => println!("Habe Ashleys Nummer nicht."),
    }

    contacts.remove(&"Ashley");

    // `HashMap::iter()` gibt einen Iterator zurück, der
    // (&'a Schlüssel, &'a Wert)-Paare in beliebiger Reihenfolge liefert.
    for (contact, &number) in contacts.iter() {
        println!("Rufe {} an: {}", contact, call(number));
    }
}

Weitere Informationen darüber, wie Hashing und Hash Maps (manchmal auch Hash Tabellen genannt) funktionieren, finden Sie auf der Wikipedia-Seite zu Hash Tabellen.

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das HashMap-Lab abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.