Rust 哈希集合(HashSet)

哈希集合 HashSet,简称为 集合 (set ),是没有重复值的相同数据类型的值的集合。

哈希集合 HashSet 与 哈希表Hashmamp 最大不同就是哈希集合没有重复值。

Rust 语言标准库 std::collections 中定义了结构体 HashSet 用于描述集合。

std::collections 模块中同时包含了大量的方法用于创建、访问和操作集合。

1. 创建集合的语法

Rust 语言标准库 std::collections 的结构体 HashSet 提供了 new() 静态方法用于创建集合的一个实例。

使用 HashSet::new() 创建集合的语法格式如下

let mut hash_set_name = HashSet::new();

new() 方法会创建一个空的集合。但这个空的集合是不能立即使用的,因为它还没指定数据类型。当我们给集合添加了元素之后才能正常使用。

结构体 HashSet 同时提供了大量的方法用于操作集合中的元素,我们将常用的几个方法罗列于此

方法 方法原型 描述
insert() pub fn insert(&mut self, value: T) -> bool 插入一个值到集合中如果集合已经存在值则插入失败
len() pub fn len(&self) -> usize 返回集合中的元素个数
get() pub fn get<Q:?Sized>(&self, value: &Q) -> Option<&T> 根据指定的值获取集合中相应值的一个引用
iter() pub fn iter(&self) -> Iter 返回集合中所有元素组成的无序迭代器迭代器元素的类型为 &'a T
contains_key pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool 判断集合是否包含指定的值
remove() pub fn remove<Q: ?Sized>(&mut self, value: &Q) -> bool 从结合中删除指定的值

2. 插入一个值到集合中 insert()

insert() 用于插入一个值到集合中。

insert() 方法的函数原型如下

pub fn insert(&mut self, value: T) -> bool

insert() 用于插入一个值到集合中,如果集合中已经存在指定的值,则返回 false,否则返回 true。

注意: 集合中不允许出现重复的值,因此如果集合中已经存在相同的值,则会插入失败。

use std::collections::HashSet;

fn main() {
    let mut languages = HashSet::new();
    languages.insert("Python");
    languages.insert("Rust");
    languages.insert("Ruby");
    languages.insert("PHP");

    languages.insert("Rust"); // 插入失败但不会引发异常

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

编译运行以上 Rust 代码,输出结果如下

{"Python", "PHP", "Rust", "Ruby"}

3. 获取集合的长度 len()

len() 方法用于获取集合的长度,也就是集合中元素的个数。

len() 方法的函数原型如下

pub fn len(&self) -> usize

注意: usize 是一个指针长度类型,这个由编译时的电脑 CPU 的构架决定。

范例

use std::collections::HashSet;
fn main() {
   let mut languages = HashSet::new();
   languages.insert("Python");
   languages.insert("Rust");
   languages.insert("Ruby");
   languages.insert("PHP");
   println!("size of the set is {}",languages.len());
}

编译运行以上 Rust 代码,输出结果如下

size of the set is 4

4. 返回集合所有元素创建的迭代器 iter()

iter() 方法用于返回集合中所有元素组成的无序迭代器。

iter() 方法的函数原型如下

pub fn iter(&self) -> Iter

注意:迭代器元素的顺序是无序的,毫无规则的。而且每次调用 iter() 返回的元素顺序都可能不一样。

use std::collections::HashSet;
fn main() {
   let mut languages = HashSet::new();
   languages.insert("Python");
   languages.insert("Rust");
   languages.insert("Ruby");
   languages.insert("PHP");

   for language in languages.iter() {
      println!("{}",language);
   }
}

编译运行以上 Rust 代码,输出结果如下

PHP
Python
Rust
Ruby

5. 获取集合中指定值的一个引用 get()

get() 方法用于获取集合中指定值的一个引用。

get() 方法的原型如下

pub fn get<Q:?Sized>(&self, value: &Q) -> Option<&T>

如果值 value 存在于集合中则返回集合中的相应值的一个引用,否则返回 None。

use std::collections::HashSet;
fn main() {
   let mut languages = HashSet::new();
   languages.insert("Python");
   languages.insert("Rust");
   languages.insert("Ruby");
   languages.insert("PHP");

   match languages.get(&"Rust"){
      Some(value)=>{
         println!("found {}",value);
      }
      None =>{
         println!("not found");
      }
   }
   println!("{:?}",languages);
}

编译运行以上 Rust 代码,输出结果如下

found Rust
{"Python", "Ruby", "PHP", "Rust"}

6. 判断集合是否包含某个值 contains()

contains() 方法用于判断集合是否包含指定的值。

contains() 方法的函数原型如下

pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool

如果值 value 存在于集合中则返回 true ,否则返回 false。

use std::collections::HashSet;

fn main() {
   let mut languages = HashSet::new();
   languages.insert("Python");
   languages.insert("Rust");
   languages.insert("Ruby");

   if languages.contains(&"Rust") {
      println!("found language");
   }  
}

编译运行以上 Rust 代码,输出结果如下

found language

7. 删除集合元素 remove()

remove() 方法用于从集合中删除指定的值。

remove() 方法的原型如下

pub fn remove(&mut self, value: &Q) -> bool

删除之前如果值 value 存在于集合中则返回 true,如果不存在则返回 false。

use std::collections::HashSet;

fn main() {
   let mut languages = HashSet::new();
   languages.insert("Python");
   languages.insert("Rust");
   languages.insert("Ruby");
   println!("length of the Hashset: {}",languages.len());
   languages.remove(&"Kannan");
   println!("length of the Hashset after remove() : {}",languages.len());
}

下一章:Rust 结构体

Rust 结构体(struct):Rust 结构体是由一组数据组合而成的一种数据类型。组成结构体的每项数据称为结构体的“成员”。Rust 语言中定义结构体的关键字是 struct。Rust 结构体定义的语法:Rust 结构体是一个 复合类型。结构体中的所有元素/字段必须明确指明它的数据类型。