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

标签 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 )

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

最佳答案

除了 hellow 的答案之外,还可以通过使用 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 只能有唯一的成员,这使得向量只保留其重复元素的第一次出现。

关于rust - Vec::dedup 不起作用——如何从字符向量中过滤重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53318918/

相关文章:

rust - 将生命周期参数限制在函数的参数范围内

rust - 为什么 rustc 不运行我的简单 "hello world"程序?

Rust 切片所有权超出其范围

rust - `FnOnce` 的实现对于异步递归来说不够通用

rust - 如何在不使用 Box 的情况下从特征方法返回匿名类型?

haskell - 如何在 Rust 中复制 Haskell 的 `scanl (+) 0 xs`?

rust - 在 Rust 中反转字符串

rust - 将Vec <[f64; 1]>转换为Vec <f64>

vector - 如何将 Vec 发送到以迭代器作为参数的函数?

rust - 将可变自引用传递给拥有对象的方法