rust 过滤不符合条件的项目

xghobddn  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(52)

假设我得到了这个向量:let vec = vec![0,2,4,6,8]和这个范围:let range = 0..10。我想收集vec中不属于该范围的所有值,所以我的结果向量应该是这样的:[1,3,5,7,9]
我是这样试的:

fn main() {
    let range = 0..10;
    let vec = vec![0,2,4,6,8];

    let x = vec.iter().filter(|&x| !range.contains(x)).collect::<Vec<&i32>>();

    println!("{:?}",x);
}

字符串
我试着用!来反演contains()的结果,但它对结果没有影响。
另外,我将如何收集到一个vec<i32>,而不是&i32

jutyujz0

jutyujz01#

除了矛盾的问题(哪些元素应该被包括在内-那些在范围内的,还是那些在范围外的),我假设你想 * 保留 * 在范围内的元素,你有两种解决方案。你可以修改vector in place(1),或者创建一个新的vector,复制range(2)中的值。
在第一种情况下,您可以简单地使用Vec::retain

use std::ops::RangeBounds;

pub fn filter_in_place<T, R>(data: &mut Vec<T>, range: R)
where
    R: RangeBounds<T>,
    T: PartialOrd,
{
    data.retain(|x| range.contains(x));
}

字符串
在第二种情况下,可以使用Iterator::filter和Iterator::copied

use std::ops::RangeBounds;

pub fn filter<T, R>(data: &[T], range: R) -> Vec<T>
where
    R: RangeBounds<T>,
    T: PartialOrd + Copy,
{
    data.iter().copied().filter(|x| range.contains(x)).collect()
}

相关问题