如何从结构向量中删除重复项?

时间:2019-09-11 11:45:54

标签: rust

我有一个结构和一个向量:

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_bydedup_by,但是我只知道如何将它们与原始类型一起使用。就我而言,这些方法无法原样应用,对吗?

然后如何删除重复项?

1 个答案:

答案 0 :(得分:1)

dedup函数家族将无济于事,因为它们只会清除邻居重复项。 sort函数族需要Ord才能起作用,而Eq也需要。这样,您就有三个选择可供选择:

  • 您可以实现Eq(可以在#[derive]中使用)和Hash(如果所有字段都实现{{1 }}}放在#[derive]上,然后将Hash转换成HashSet。这使您可以立即获得非常高效的set原语

  • 您可以实现一个naive filter (playground link),其内存和处理复杂度为struct,这将保留所有访问节点的内部状态,并仅基于该状态进行过滤。此方法的唯一要求是Vec,它很容易O(N)。这可以进一步优化。下面的当前代码被实现为扩展特性,以使您可以在任何地方重复使用它:

    PartialEq

还有其他实现方式/方法,但这是最快的一些方法。