Rust 语言的 HashMap 数据存储教程

Beginner

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

简介

在本实验中,我们将学习 Rust 中的HashMap,它用于按键存储值。HashMap的键可以是各种类型,包括布尔值、整数、字符串或任何其他实现了EqHash特征的类型。HashMap可以根据元素数量动态增长和收缩。我们可以使用HashMap::with_capacity(uint)创建具有特定容量的HashMap,或者使用HashMap::new()获取具有默认初始容量的HashMap。提供的代码示例通过存储联系人姓名和电话号码并执行插入、检索、修改和删除等操作来演示HashMap的用法。

注意:如果实验未指定文件名,你可以使用任何你想要的文件名。例如,你可以使用main.rs,并通过rustc main.rs &&./main进行编译和运行。

HashMap

向量通过整数索引来存储值,而HashMap则通过键来存储值。HashMap的键可以是布尔值、整数、字符串,或者任何其他实现了EqHash特征的类型。下一节会详细介绍。

与向量一样,HashMap是可增长的,但当有多余空间时,HashMap也可以自行收缩。你可以使用HashMap::with_capacity(uint)创建具有特定初始容量的HashMap,或者使用HashMap::new()来获取具有默认初始容量的HashMap(推荐)。

use std::collections::HashMap;

fn call(number: &str) -> &str {
    match number {
        "798-1364" => "We're sorry, the call cannot be completed as dialed.
            Please hang up and try again.",
        "645-7689" => "Hello, this is Mr. Awesome's Pizza. My name is Fred.
            What can I get for you today?",
        _ => "Hi! Who is this again?"
    }
}

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

    // 接受一个引用并返回 Option<&V>
    match contacts.get(&"Daniel") {
        Some(&number) => println!("Calling Daniel: {}", call(number)),
        _ => println!("Don't have Daniel's number."),
    }

    // `HashMap::insert()` 如果插入的值是新的,则返回 `None`,否则返回 `Some(value)`
    contacts.insert("Daniel", "164-6743");

    match contacts.get(&"Ashley") {
        Some(&number) => println!("Calling Ashley: {}", call(number)),
        _ => println!("Don't have Ashley's number."),
    }

    contacts.remove(&"Ashley");

    // `HashMap::iter()` 返回一个迭代器,它以任意顺序生成
    // (&'a key, &'a value) 对。
    for (contact, &number) in contacts.iter() {
        println!("Calling {}: {}", contact, call(number));
    }
}

有关哈希和哈希映射(有时称为哈希表)的工作原理的更多信息,请查看维基百科上的哈希表词条。

总结

恭喜你!你已经完成了 HashMap 实验。你可以在 LabEx 中练习更多实验来提升你的技能。