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

时间:2018-01-04 19:58:25

标签: iterator rust

我想将Vec分成等长的部分,然后map。我有一个调用Vec chunks()方法的迭代器。这可能会让我的部分比其他部分小,这将是它产生的最后一个元素。

为了确保所有部分都具有相同的长度,我只想删除最后一个元素,然后在左边的内容上调用map()

2 个答案:

答案 0 :(得分:7)

作为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);
}
  

为了确保所有部分都具有相同的长度,我只想删除最后一个元素

始终删除最后一个元素赢了这样做。例如,如果您均匀地填充输入,那么总是丢弃最后一个元素将丢失一个完整的块。你必须做一些预先计算,以决定你是否需要放弃它。

答案 1 :(得分:6)

您可以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