我有一个结构和一个向量:
enum MySize {
Big,
Small,
Medium,
Huge,
}
struct MyStruct {
my_size: MySize,
field1: String,
field2: u64,
field3: f64,
}
let mut my_structs: Vec<MyStruct> = get_data_with_duplicates();
//how to remove duplicates from 'my_structs'?
我知道sort_by
和dedup_by
,但是我只知道如何将它们与原始类型一起使用。就我而言,这些方法无法原样应用,对吗?
然后如何删除重复项?
答案 0 :(得分:1)
dedup
函数家族将无济于事,因为它们只会清除邻居重复项。 sort
函数族需要Ord
才能起作用,而Eq
也需要。这样,您就有三个选择可供选择:
您可以实现Eq
(可以在#[derive]
中使用)和Hash
(如果所有字段都实现{{1 }}}放在#[derive]
上,然后将Hash
转换成HashSet
。这使您可以立即获得非常高效的set原语
您可以实现一个naive filter (playground link),其内存和处理复杂度为struct
,这将保留所有访问节点的内部状态,并仅基于该状态进行过滤。此方法的唯一要求是Vec
,它很容易O(N)
。这可以进一步优化。下面的当前代码被实现为扩展特性,以使您可以在任何地方重复使用它:
PartialEq
还有其他实现方式/方法,但这是最快的一些方法。