Learn Rust Coding · 课时

使用 HashSet

跟踪唯一值。

第 3 / 4 课13 个步骤

使用 HashSet 是 CoddyKit 上的免费 Learn Rust Coding 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Learn Rust Coding 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Learn Rust Coding 课程共包含 4 节课。

什么是 HashSet?

HashSet 存储一组 unique 值。它没有重复项,也没有键,只有成员。

它非常适合快速回答一个问题:“以前见过这个值吗?”

创建集合

与 HashMap 一样,HashSet 位于 std::collections 中,需要使用 use 导入。

使用 HashSet::new() 创建一个空集合,并将其声明为 mut 以便添加项目。

use std::collections::HashSet;

fn main() {
    let mut s: HashSet<i32> = HashSet::new();
    s.insert(1);
    s.insert(2);
    println!("size: {}", s.len());
}

插入与重复项

insert 方法返回一个 bool:如果值是新值则返回 true,如果值已经存在则返回 false。

插入重复值不会产生任何效果,因此集合会自动保持唯一。

use std::collections::HashSet;

fn main() {
    let mut s = HashSet::new();
    println!("{}", s.insert(5));
    println!("{}", s.insert(5));
    println!("len = {}", s.len());
}

成员资格测试

使用 contains 检查某个值是否在集合中。它会返回一个 bool。

这也是使用集合最常见的原因:查找快速而清晰。

use std::collections::HashSet;

fn main() {
    let mut s = HashSet::new();
    s.insert("red");
    s.insert("blue");
    println!("has red? {}", s.contains("red"));
    println!("has green? {}", s.contains("green"));
}

删除成员

remove 方法接收一个值;如果该值原本存在并已被删除,则返回 true。

删除不存在的内容时,只会返回 false。

use std::collections::HashSet;

fn main() {
    let mut s = HashSet::new();
    s.insert(7);
    println!("{}", s.remove(&7));
    println!("{}", s.remove(&7));
}

从迭代器构建集合

您可以将包含值的任意迭代器直接收集到 HashSet 中。

这是去重的一种快捷方式:输入包含重复项的列表,集合会让每个值只保留一次。

use std::collections::HashSet;

fn main() {
    let nums = [1, 2, 2, 3, 3, 3];
    let unique: HashSet<i32> = nums.iter().copied().collect();
    println!("distinct: {}", unique.len());
}

遍历集合

使用 for 循环遍历集合,以访问其中的每个成员。

与 HashMap 一样,迭代顺序没有保证,并且每次运行可能不同。

use std::collections::HashSet;

fn main() {
    let s: HashSet<i32> = [10, 20, 30].into_iter().collect();
    let mut total = 0;
    for v in &s {
        total += v;
    }
    println!("sum = {}", total);
}

并集

union 方法会给出任意一个集合中包含的所有值。

它会返回一个迭代器,因此请将其收集到新集合中,或遍历它。

use std::collections::HashSet;

fn main() {
    let a: HashSet<i32> = [1, 2, 3].into_iter().collect();
    let b: HashSet<i32> = [3, 4].into_iter().collect();
    let u: HashSet<i32> = a.union(&b).copied().collect();
    println!("union size: {}", u.len());
}

交集

intersection 方法会产生同时存在于两个集合中的值。

它非常适合查找共同元素,例如共享的标签或共同的好友。

use std::collections::HashSet;

fn main() {
    let a: HashSet<i32> = [1, 2, 3].into_iter().collect();
    let b: HashSet<i32> = [2, 3, 4].into_iter().collect();
    let common: Vec<i32> = a.intersection(&b).copied().collect();
    println!("common count: {}", common.len());
}

差集

difference 方法会产生存在于第一个集合、但不存在于第二个集合中的值。

交换集合的顺序即可得到相反方向的差集。此外,还有 symmetric_difference,用于获取只存在于其中一个集合中的项目。

use std::collections::HashSet;

fn main() {
    let a: HashSet<i32> = [1, 2, 3].into_iter().collect();
    let b: HashSet<i32> = [2].into_iter().collect();
    let only_a: Vec<i32> = a.difference(&b).copied().collect();
    println!("only in a: {}", only_a.len());
}

子集与不相交

使用 is_subset 检查一个集合中的每个成员是否都存在于另一个集合中。

使用 is_disjoint 检查两个集合是否完全没有共同值。两者都会返回普通的 bool。

use std::collections::HashSet;

fn main() {
    let a: HashSet<i32> = [1, 2].into_iter().collect();
    let b: HashSet<i32> = [1, 2, 3].into_iter().collect();
    println!("a subset of b? {}", a.is_subset(&b));
}

快速检查

您将同一个值插入 HashSet 两次。

回顾

HashSet 保存唯一值,并能快速使用 contains 进行检查。

您插入并移除了值,通过 collect 去除了重复项,还使用 union、intersection 和 difference 组合了集合。

免费开始

用 AI 导师学习 Rust — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
39
课程
144

常见问题解答

「使用 HashSet」课时是免费的吗?

是的 — 「使用 HashSet」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Learn Rust Coding 课程的其余内容,请升级到 CoddyKit PRO。 Learn Rust Coding 课程共包含 4 节课。

「使用 HashSet」这节课中我会学到什么?

跟踪唯一值。 你通过在浏览器中直接运行的动手代码来练习 Learn Rust Coding,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Learn Rust Coding 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Learn Rust Coding 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用 HashSet」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Learn Rust Coding 课中编写并运行代码吗?

能。每节 Learn Rust Coding 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 构建 HashMap
  2. Entry API 与默认值
  3. 使用 HashSet
  4. 计数和分组
← 返回 Learn Rust Coding