Rust 哈希表(HashMap)
哈希表 HashMap 就是 键值对 的集合。哈希表中不允许有重复的键,但允许不同的键有相同的值。
哈希表 HashMap 常用于通过键查找对应的值。
Rust 语言使用 HashMap 结构体来表示哈希表。
HashMap 结构体在 Rust 语言标准库中的 std::collections 模块中定义。
使用 HashMap 结构体之前需要显式导入 std::collections 模块。
1. 创建哈希表的语法
Rust 语言标准库 std::collections 的结构体 HashMap 提供了 new() 静态方法用于创建哈希表的一个实例。
使用 HashMap::new() 创建哈希表的语法格式如下
let mut instance_name = HashMap::new();
new() 方法会创建一个空的哈希表。但这个空的哈希表是不能立即使用的,因为它还没指定数据类型。当我们给哈希表添加了元素之后才能正常使用。
结构体 HashMap 同时提供了大量的方法用于操作哈希表中的元素,我们将常用的几个方法罗列于此
方法 | 方法签名 | 说明 |
---|---|---|
insert() | pub fn insert(&mut self, k: K, v: V) -> Option | 插入/更新一个键值对到哈希表中,如果数据已经存在则返回旧值,如果不存在则返回 None |
len() | pub fn len(&self) -> usize | 返回哈希表中键值对的个数 |
get() | pub fn get<Q: ?Sized>(&lself, k: &Q) -> Option<&V> | 根据键从哈希表中获取相应的值 |
iter() | pub fn iter(&self) -> Iter<K, V> | 返回哈希表键值对的无序迭代器,迭代器元素类型为 (&'a K, &'a V) |
contains_key | pub fn contains_key<Q: ?Sized>(&self, k: &Q) -> bool | 如果哈希表中存在指定的键则返回 true 否则返回 false |
remove() | pub fn remove_entry<Q: ?Sized>(&mut self, k: &Q) -> Option<(K, V)> | 从哈希表中删除并返回指定的键值对 |
2. 插入/更新一个键值对到哈希表中 insert()
insert() 方法用于插入或更新一个键值对到哈希表中。
如果键已经存在,则更新为新的简直对,并则返回旧的值。
如果键不存在则执行插入操作并返回 None。
use std::collections::HashMap; fn main(){ let mut stateCodes = HashMap::new(); stateCodes.insert("name","简单教程"); stateCodes.insert("site","https://www.twle.cn"); println!("{:?}",stateCodes); }
编译运行以上 Rust 代码,输出结果如下
{"name": "简单教程", "site": "https://www.twle.cn"}
3. 获取哈希表中键值对的个数 len()
len() 方法用于获取哈希表的长度,也就是哈希表中键值对的个数。
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("name","简单教程"); stateCodes.insert("site","https://www.twle.cn"); println!("size of map is {}",stateCodes.len()); }
编译运行以上 Rust 代码,输出结果如下
size of map is 2
4. 根据键从哈希表中获取相应的值 get()
get() 方法用于根据键从哈希表中获取相应的值。
如果值不存在,也就是哈希表不包含参数的键则返回 None。
如果值存在,则返回值的一个引用。
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("name","简单教程"); stateCodes.insert("site","https://www.twle.cn"); println!("size of map is {}",stateCodes.len()); println!("{:?}",stateCodes); match stateCodes.get(&"name") { Some(value)=> { println!("Value for key name is {}",value); } None => { println!("nothing found"); } } }
编译运行以上 Rust 代码,输出结果如下
size of map is 2 {"name": "简单教程", "site": "https://www.twle.cn"} Value for key name is 简单教程
5. 迭代哈希表 iter()
iter() 方法会返回哈希表中 键值对的引用 组成的无序迭代器。
迭代器元素的类型为 (&'a K, &'a V)。
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("name","简单教程"); stateCodes.insert("site","https://www.twle.cn"); for (key, val) in stateCodes.iter() { println!("key: {} val: {}", key, val); } }
编译运行以上 Rust 代码,输出结果如下
key: site val: https://www.twle.cn key: name val: 简单教程
6. 是否包含指定的键 contains_key()
contains_key() 方法用于判断哈希表中是否包含指定的 键值对。
如果包含指定的键,那么会返回相应的值的引用,否则返回 None。
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("name","简单教程"); stateCodes.insert("site","https://www.twle.cn"); stateCodes.insert("slogn","简单教程,简单编程"); if stateCodes.contains_key(&"name") { println!("found key"); } }
编译运行以上 Rust 代码,输出结果如下
found key
7. 从哈希表中删除指定键值对 remove()
remove() 用于从哈希表中删除指定的键值对。
如果键值对存在则返回删除的键值对,返回的数据格式为 (&'a K, &'a V)。
如果键值对不存在则返回 None
use std::collections::HashMap; fn main() { let mut stateCodes = HashMap::new(); stateCodes.insert("name","简单教程"); stateCodes.insert("site","https://www.twle.cn"); stateCodes.insert("slogn","简单教程,简单编程"); println!("length of the hashmap {}",stateCodes.len()); stateCodes.remove(&"site"); println!("length of the hashmap after remove() {}",stateCodes.len()); }
编译运行以上 Rust 代码,输出结果如下
length of the hashmap 3 length of the hashmap after remove() 2
Rust 哈希集合(HashSet):哈希集合 HashSet,简称为 < strong>集合,是没有重复值的相同数据类型的值的集合。哈希集合 HashSet 与 哈希表Hashmamp 最大不同就是哈希集合没有重复值。Rust 语言标准库 std::collections 中定义了结构体 HashSet 用于描述集合。std::collections< /code> 模块中同时包含了大量的方法用于创建、访问和操作集合。