Rust如何对数组、vector等序列去重得到仅含唯一值的序列
Rust 序列类型去重的简洁实现方法
以下是不同场景下满足要求的去重方案,全部基于标准库实现,逻辑清晰易读:
方案1:无需保留原始出现顺序(性能最优)
直接用HashSet的自动去重特性即可,实现代码最短:
use std::collections::HashSet; fn main() { let arr = [1, 2, 2, 3, 2]; // 转HashSet自动去重,再转Vec let unique_set: HashSet<u32> = arr.into_iter().collect(); let unique_vec: Vec<u32> = unique_set.into_iter().collect(); println!("{:?}", unique_vec); // 输出元素均唯一,但顺序不固定 }
优缺点:时间复杂度为O(n),性能最高,但不会保留元素第一次出现的顺序,适合对输出顺序无要求的场景。
方案2:保留原始出现顺序(符合题目示例要求)
题目示例要求输出[1,2,3],对应保留元素首次出现顺序的场景,可以用HashSet做已出现元素的标记,配合迭代器实现:
use std::collections::HashSet; fn main() { let arr = [1, 2, 2, 3, 2]; let mut seen = HashSet::new(); let unique_vec: Vec<u32> = arr.into_iter() .filter(|&x| seen.insert(x)) // insert返回true代表元素首次出现 .collect(); println!("{:?}", unique_vec); // 稳定输出 [1, 2, 3] // 后续直接遍历即可 for num in unique_vec { println!("{}", num); } }
优缺点:时间复杂度为O(n),同时保留元素首次出现的顺序,逻辑简洁易懂,是最贴合题目需求的方案。
方案3:可接受排序的场景(无额外内存开销)
如果允许修改原始序列、且对顺序无要求,可以先排序再调用Vec自带的dedup方法原地去重,不需要引入任何额外集合:
fn main() { let mut vec = vec![1, 2, 2, 3, 2]; vec.sort(); // 排序后变为[1,2,2,2,3] vec.dedup(); // 原地去除相邻重复元素 println!("{:?}", vec); // 输出 [1, 2, 3] }
优缺点:没有额外的内存开销,但排序的时间复杂度为O(n log n),性能略低于前两种方案,且会打乱原始序列的元素顺序。
内容的提问来源于stack exchange,提问作者JamesThomasMoon
相关产品推荐
相关产品推荐

