Rust 使用 HashMap<K, V> 储存键值对

简介

在本教程中,我们将深入探讨如何在 Rust 编程语言中使用 HashMap<K, V> 来高效地存储和检索键值对。HashMap 是一个无序的数据结构,它能够提供常数时间复杂度(O(1))的插入、删除和搜索操作。

前置要求

  • Rust 编程语言基础知识
  • 对 Rust 中的所有权和借用概念有一定的了解

创建 HashMap

首先,我们需要导入 std::collections 模块来使用 HashMap

use std::collections::HashMap;

然后,我们可以通过 new() 方法创建一个空的 HashMap

let mut scores = HashMap::new();

注意,我们需要在变量名前加上 mut 关键字,因为 HashMap 是可变的。

插入元素

我们可以使用 insert() 方法向 HashMap 中插入一个键值对:

scores.insert(String::from("Blue"), 10);

这里,"Blue" 是键(Key),它的类型为 String10 是值(Value),它的类型为 i32

访问元素

我们可以使用索引操作符 [] 来访问 HashMap 中的值:

let team_name = String::from("Blue");
let score = scores[&team_name];

注意,我们需要借用键的引用(&team_name),而不是键本身。这是因为 HashMap 对于它所拥有的值实施了所有权。

如果你尝试使用一个没有关联值的键来索引 HashMap,程序会出现错误。为了处理这种情况,可以使用 get() 方法:

let team_name = String::from("Yellow");
match scores.get(&team_name) {
    Some(score) => println!("{}: {}", team_name, score),
    None => println!("{} is not in the map", team_name),
}

这个方法会返回一个 Option<&V> 类型的值。如果键存在,它会包含对应的值;如果不存在,它会包含 None

更新 HashMap

当你插入一组键和值时,如果键已经存在于 HashMap 中,那么这个键的旧值就会被替换为新值:

scores.insert(String::from("Blue"), 20);
println!("{:?}", scores); // {"Blue": 20}

如果你想要在键对应的值不存在时才插入一个值,可以使用 entry() 方法并配合 or_insert() 方法:

scores.entry(String::from("Yellow")).or_insert(50);
println!("{:?}", scores); // {"Blue": 20, "Yellow": 50}

如果你想要基于一个键的旧值来更新它,可以使用 entry() 方法并配合 or_insert()and_modify()

let text = "hello world wonderful world";

let mut map = HashMap::new();

for word in text.split_whitespace() {
    let count = map.entry(word).or_insert(0);
    *count += 1;
}

println!("{:?}", map);

在这个例子中,我们遍历了一个字符串切片(text),对于每个单词,如果它已经是 map 的键,我们就将其值加一;如果不是,我们就插入一个新的键值对,其值为1。

结论

本教程详细介绍了如何在 Rust 编程语言中使用 HashMap<K, V> 来高效地存储和检索键值对。我们学习了如何创建一个 HashMap,如何插入元素,如何访问元素,以及如何更新 HashMap。希望这些知识能够帮助你在 Rust 项目中更好地使用 HashMap