Use all but the last element from an iterator

对着背影说爱祢 提交于 2021-01-21 07:11:15

问题


I want to split a Vec into some parts of equal length, and then map over them. I have an iterator resulting from a call to Vec's chunks() method. This may leave me with a part that will be smaller than other parts, which will be the last element generated by it.

To be sure that all parts have equal length, I just want to drop that last element and then call map() on what's left.


回答1:


As Sebastian Redl points out, checking the length of each chunk is the better solution for your specific case.

To answer the question you asked ("Use all but the last element from an iterator"), you can use Iterator::peekable to look ahead one. That will tell you if you are on the last item or not and you can decide to skip processing it if so.

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

To be sure that all parts have equal length, I just want to drop that last element

Always dropping the last element won't do this. For example, if you evenly chunk up your input, then always dropping the last element would lose a full chunk. You'd have to do some pre-calculation to decide if you need to drop it or not.




回答2:


You can filter() the chunks iterator on the slice's len() being the amount you passed to chunks():

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

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

As of Rust 1.31, you can use the chunks_exact method as well:

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

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

Note that the returned iterator also has the method remainder if you need to get the uneven amount of items at the very end.



来源:https://stackoverflow.com/questions/48102662/use-all-but-the-last-element-from-an-iterator

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!