Vec :: dedup不起作用-如何从字符向量中过滤重复项?

时间:2018-11-15 11:53:07

标签: rust

我需要从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

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

2 个答案:

答案 0 :(得分:7)

除了下面的答案外,还可以通过使用<table class="display table table-striped table-bordered dt-responsive"> 对向量进行重复数据删除而不进行排序:

HashSet

Vec::retain保留满足谓词的元素,如果插入的元素不存在于集合中,则HashSet::insert返回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'] } 。由于true只能具有唯一的成员,因此这使得向量仅保留其重复元素的首次出现。

答案 1 :(得分:5)

引用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)
}