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