给定一片u32,我如何过滤出一个特定的数字并获得Vec <u32>?

给定u32的一部分,我想过滤出数字0。这可以是任何数字或任何其他规则/条件。

这里有一些可行的版本,但我觉得可以做得更简单:

fn test(factors: &[u32]) {
    let factors1 = factors
        .iter()
        .map(|&x| x as u32)
        .filter(|x| *x != 0)
        .collect::<Vec<u32>>();

    let factors1 = factors
        .iter()
        .map(|&x| x as u32)
        .filter(|&x| x != 0)
        .collect::<Vec<u32>>();

    let factors2 = factors
        .iter()
        .filter(|x| **x != 0)
        .collect::<Vec<&u32>>();

    let factors3 = factors
        .iter()
        .filter(|&&x| x != 0)
        .collect::<Vec<&u32>>();
}

我期待这样的简单操作(无效):

let factors4 = factors.iter().filter(|x| x != 0).collect();

可能有帮助的事情是:

  • 是否可以将&u32转换/克隆为u32
  • 是否可以将&[u32]克隆到[u32]
greentao 回答:给定一片u32,我如何过滤出一个特定的数字并获得Vec <u32>?

您可以在单个步骤中使用filter_mapfiltermap

fn make_vec_of_nonzero(factors: &[u32]) -> Vec<u32> {
    factors
        .iter()
        .filter_map(|&x| if x == 0 { None } else { Some(x) })
        .collect()
}
,

至少有Iterator.copied()

let factors4: Vec<u32> = factors
    .iter()
    .copied()
    .filter(|&x| x != 0)
    .collect();
本文链接:https://www.f2er.com/3169627.html

大家都在问