跳到主要内容

Rust哈希映射

提示
  1. 定义和创建HashMap:在Rust中,HashMap允许以键值对的形式存储数据,通过导入std::collections::HashMap模块并使用HashMap::new()创建。
  2. HashMap基本操作:HashMap支持添加(insert())、访问(get())、删除(remove())和修改元素。这些操作通过键来实现,键必须是唯一的。
  3. 额外的HashMap方法:除了基本操作外,HashMap还提供了其他方法,如len()获取长度、contains_key()检查键是否存在、iter()返回条目迭代器、values()keys()分别返回值和键的迭代器,以及clone()创建HashMap副本。

Rust 中的 HashMap 数据结构允许我们以 键值对 的形式存储数据。以下是 hashmap 的一些特点:

  • 每个值都与一个相应的键相关联。
  • 键是唯一的,而值可以重复。
  • 可以使用相应的键来访问值。

在 Rust 中创建 HashMap

HashMap 是 Rust 标准集合库的一部分,因此我们必须在程序中包含 HashMap 模块以使用它。

use std::collections::HashMap;

我们可以使用 use 声明来导入 HashMap 模块。它应该位于程序的顶部。

现在,我们可以使用 HashMap 模块中的 new() 方法创建一个 hashmap。例如,

let mut info: HashMap<i32, String> = HashMap::new();

这里,

  • let mut info - 声明了一个可变变量 info
  • HashMap<i32, String> - HashMap 的类型,其中键是整数,值是字符串
  • HashMap::new() - 创建一个新的 HashMap

示例:创建一个 HashMap

// 从 Rust 标准集合库中导入 HashMap
use std::collections::HashMap;

fn main() {
// 创建一个新的 HashMap
let mut info: HashMap<i32, String> = HashMap::new();

println!("HashMap = {:?}", info);
}

输出

HashMap = {}

在这里,我们创建了一个空的 HashMap 并将其打印到屏幕上。

注意: 我们在 println! 宏中使用 :? 来打印 HashMap。

Rust 中的 HashMap 操作

HashMap 模块提供了各种方法来执行 hashmap 中的基本操作。

  • 添加元素
  • 访问值
  • 删除元素
  • 更改元素

1. 在 Rust 中向 HashMap 添加元素

我们可以使用 insert() 方法向 hashmap 中添加元素(键值对)。例如,

let mut fruits: HashMap<i32, String> = HashMap::new();

// 向 hashmap 中插入元素
fruits.insert(1, String::from("Apple"));
fruits.insert(2, String::from("Banana"));

这里,我们在绑定到变量 fruitsHashMap 中插入了两个键值对。这里的 String::from() 方法创建了一个 String 类型的值。

注意: 由于 mut 变量声明,才可能向 HashMap 添加新的键值对。

示例:向 HashMap 添加元素

use std::collections::HashMap;

fn main() {
let mut fruits: HashMap<i32, String> = HashMap::new();

// 在 hashmap 中添加键值对
fruits.insert(1, String::from("Apple"));
fruits.insert(2, String::from("Banana"));

println!("fruits = {:?}", fruits);
}

输出

fruits = {1: "Apple", 2: "Banana"}

2. 在 Rust 中访问 HashMap 中的值

我们可以使用 get() 方法从给定的 hashmap 中访问一个值。例如,

let mut fruits: HashMap<i32, String> = HashMap::new();

fruits.insert(1, String::from("Apple"));
fruits.insert(2, String::from("Banana"));

let first_fruit = fruits.get(&1);

这里,我们使用键 &1get() 方法从 hashmap 中获取一个值。

我们使用与键(&1)一起的和号(&)作为参数,因为 get() 方法返回的是值的引用,而不是 HashMap 中的实际值。

示例:在 HashMap 中访问值

use std::collections::HashMap;

fn main() {
let mut fruits: HashMap<i32, String> = HashMap::new();

// 在 hashmap 中插入元素
fruits.insert(1, String::from("Apple"));
fruits.insert(2, String::from("Banana"));

// 在 hashmap 中访问值
let first_fruit = fruits.get(&1);
let second_fruit = fruits.get(&2);
let third_fruit = fruits.get(&3);

println!("第一个水果 = {:?}", first_fruit);
println!("第二个水果 = {:?}", second_fruit);
println!("第三个水果 = {:?}", third_fruit);
}

输出

第一个水果 = Some("Apple")
第二个水果 = Some("Banana")
第三个水果 = None

注意,我们使用与键(&1&2)一起的和号(&)作为 get() 方法的参数。

let first_fruit = fruits.get(&1);
let second_fruit = fruits.get(&2);

get() 方法的输出是一个 Option 枚举,这意味着如果作为参数传递的键匹配,则返回 Some 值,如果不匹配,则返回 None

在上述示例中,let third_fruit = fruits.get(&3) 返回 None,因为键 &3 在 hashmap 中没有匹配的项。

3. 在 Rust 中从 HashMap 中移除元素

我们可以通过向 remove() 方法提供一个键来从 hashmap 中移除元素。例如,

let mut fruits: HashMap<i32, String> = HashMap::new();

fruits.insert(1, String::from("Apple"));
fruits.insert(2, String::from("Banana"));

fruits.remove(&1);

这里,我们使用键和 remove() 方法从 hashmap 中移除一个值。

示例:在 HashMap 中移除元素

use std::collections::HashMap;

fn main() {
let mut fruits: HashMap<i32, String> = HashMap::new();

// 在 hashmap 中插入值
fruits.insert(1, String::from("Apple"));
fruits.insert(2, String::from("Banana"));

println!("移除操作前的 fruits = {:?}", fruits);

// 在 hashmap 中移除值
fruits.remove(&1);

println!("移除操作后的 fruits = {:?}", fruits);
}

输出

fruits before remove operation = {1: "Apple", 2: "Banana"}
fruits after remove operation = {2: "Banana"}

这里,我们使用 remove() 方法在哈希图中移除键为 &1 的元素。

4. 在 Rust 中更改 HashMap 的元素

我们可以使用 insert() 方法来更改/更新哈希图中的元素。例如,

let mut fruits: HashMap<i32, String> = HashMap::new();

// 在哈希图中插入值
fruits.insert(1, String::from("Apple"));
fruits.insert(2, String::from("Banana"));

// 更新键为 1 的元素的值
fruits.insert(1, String::from("Mango"));

这里,最后一次 insert 表达式更新了键为 1 的元素的初始值。

示例:更改 HashMap 的元素

use std::collections::HashMap;

fn main() {
let mut fruits: HashMap<i32, String> = HashMap::new();

// 在哈希图中插入值
fruits.insert(1, String::from("Apple"));
fruits.insert(2, String::from("Banana"));

println!("更新前 = {:?}", fruits);

// 更改键为 1 的哈希图值
fruits.insert(1, String::from("Mango"));

println!("更新后 = {:?}", fruits);
}

输出

更新前 = {1: "Apple", 2: "Banana"}
更新后 = {1: "Mango", 2: "Banana"}

Rust HashMap 的其他方法

除了基本方法外,这里还有一些常用的 HashMap 方法。

方法描述
len()返回 HashMap 的长度。
contains_key()检查指定键是否存在值。
iter()返回 HashMap 条目的迭代器。
values()返回 HashMap 值的迭代器。
keys()返回 HashMap 键的迭代器。
clone()创建并返回 HashMap 的副本。

示例:Rust HashMap 方法

use std::collections::HashMap;

fn main() {
let mut fruits: HashMap<i32, String> = HashMap::new();

fruits.insert(1, String::from("Apple"));
fruits.insert(2, String::from("Banana"));

// 使用 values() 方法循环并打印哈希图的值
for fruit in fruits.values() {
println!("{}", fruit)
}

// 使用 len() 方法打印哈希图的长度
println!("fruits 的长度 = {}", fruits.len());
}

输出

Apple
Banana
fruits 的长度 = 2

这里,我们使用 HashMap 的 values() 方法遍历其值,并使用 len() 方法找出哈希图的长度。