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 哈希集合

Rust 哈希集合(HashSet):哈希集合 HashSet,简称为 < strong>集合,是没有重复值的相同数据类型的值的集合。哈希集合 HashSet 与 哈希表Hashmamp 最大不同就是哈希集合没有重复值。Rust 语言标准库 std::collections 中定义了结构体 HashSet 用于描述集合。std::collections< /code> 模块中同时包含了大量的方法用于创建、访问和操作集合。