rust 使用迭代器中除最后一个元素之外的所有元素

tzxcd3kk  于 2022-12-04  发布在  其他
关注(0)|答案(3)|浏览(190)

我想把一个Vec分割成长度相等的部分,然后用map覆盖它们。我有一个迭代器,它是通过调用Vecchunks()方法产生的。这样我可能会得到一个比其他部分小的部分,这将是它产生的最后一个元素。
为了确保所有部分的长度相等,我只想删除最后一个元素,然后对剩下的部分调用map()

2vuwiymt

2vuwiymt1#

作为Sebastian Redl points out,检查每个块的len gth对于您的特定情况是更好的解决方案。
要回答你 * 问 * 的问题(“使用迭代器中除最后一个元素以外的所有元素”),你可以使用Iterator::peekable来预测一个元素,它会告诉你是否在最后一个元素上,如果是,你可以决定跳过它。

let things = [0, 1, 2, 3, 4];

let mut chunks = things.chunks(2).peekable();
while let Some(chunk) = chunks.next() {
    if chunks.peek().is_some() {
        print!("Not the last: ");
    } else {
        print!("This is the last: ")
    }

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

为了确保所有部分的长度相等,我只想删除最后一个元素
总是删除最后一个元素 * 不会 * 做到这一点。例如,如果你均匀地将输入分块,那么总是删除最后一个元素将丢失一整块。你必须做一些预先计算来决定是否需要删除它。

gcxthw6b

gcxthw6b2#

你可以对切片的len()上的块迭代器进行filter()len()是你传递给chunks()的量:

let things = [0, 1, 2, 3, 4];

for chunk in things.chunks(2).filter(|c| c.len() == 2) {
    println!("{:?}", chunk);
}

从Rust 1.31开始,您也可以使用chunks_exact方法:

let things = [0, 1, 2, 3, 4];

for chunk in things.chunks_exact(2) {
    println!("{:?}", chunk);
}

请注意,如果您需要在最后获得不均匀数量的项,则返回的迭代器还具有方法remainder

wlwcrazw

wlwcrazw3#

作为一种替代解决方案,它(可能)比Shepmaster的解决方案性能稍高,而且更简洁,您可以使用std::iter::DoubleEndedIterator中的next_back()方法:

let things = [0, 1, 2, 3, 4];

let mut chunks = things.chunks(2);
let last = chunks.next_back().unwrap();
    
println!("Last: {:?}", last);
    
for chunk in chunks {
    println!("Not last: {:?}", chunk);
}

next_back()吃掉迭代器的最后一个元素,所以在调用next_back()之后,迭代器可以用来迭代其他所有元素。

Last: [4]
Not last: [0, 1]
Not last: [2, 3]

相关问题