【问题标题】:Vec::dedup does not work — how do I filter duplicates from vector of chars? [duplicate]Vec::dedup 不起作用 - 如何从字符向量中过滤重复项? [复制]
【发布时间】:2018-11-15 11:53:06
【问题描述】:

我需要从Vec<char> 中过滤掉重复项,这是合并两个vectors 的结果。我正在使用dedup 方法,但是它只从原始部分和邻域元素中删除重复项。 例如:

fn main() {
    let mut a = "abccdddd".chars().collect::<Vec<char>>();
    let mut b = "dadddefacd".chars().collect::<Vec<char>>();
    a.append(&mut b);
    a.dedup();
    println!("{:?}", a)
}

预期:['a', 'b', 'c', 'd', 'e', 'f']
得到:['a', 'b', 'c', 'd', 'a', 'd', 'e', 'f', 'a', 'c', 'd']

(playground)

如何从合并向量中删除重复项?

【问题讨论】:

    标签: rust


    【解决方案1】:

    除了hello的答案之外,还可以使用HashSet对向量进行重复数据删除而不对其进行排序:

    use std::collections::HashSet;
    
    fn main() {
        let mut a = "zabccdddd".chars().collect::<Vec<char>>();
        let mut b = "dadddefacdz".chars().collect::<Vec<char>>();
        a.append(&mut b);
    
        let mut uniques = HashSet::new();
        a.retain(|e| uniques.insert(e.clone()));
    
        println!("{:?}", a) // ['z', 'a', 'b', 'c', 'd', 'e', 'f']
    }
    

    Vec::retain 保留满足谓词的元素,如果集合中不存在插入的元素,HashSet::insert 返回true。由于 HashSet 只能有唯一的成员,这使得向量只保留其重复元素的第一次出现。

    【讨论】:

    • 这个解决方案保留了原始向量的顺序,这有时是一个理想的属性。如果您不关心订单,我建议您从一开始就使用HashSet 而不是Vec
    【解决方案2】:

    引用Vec::dedup的文档

    删除向量中的连续个重复元素。
    如果向量已排序,则会删除所有重复项。

    您必须先对向量进行排序,然后对其进行去重。

    fn main() {
        let mut a = "abccdddd".chars().collect::<Vec<char>>();
        let mut b = "addddefacd".chars().collect::<Vec<char>>();
        a.append(&mut b);
        a.sort();
        a.dedup();
        println!("{:?}", a)
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-18
      • 2018-10-10
      • 2013-08-12
      • 1970-01-01
      • 2020-01-13
      • 2022-06-11
      • 2013-07-14
      • 2013-06-29
      • 1970-01-01
      相关资源
      最近更新 更多