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);
}
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);
}
3条答案
按热度按时间2vuwiymt1#
作为Sebastian Redl points out,检查每个块的
len
gth对于您的特定情况是更好的解决方案。要回答你 * 问 * 的问题(“使用迭代器中除最后一个元素以外的所有元素”),你可以使用
Iterator::peekable
来预测一个元素,它会告诉你是否在最后一个元素上,如果是,你可以决定跳过它。为了确保所有部分的长度相等,我只想删除最后一个元素
总是删除最后一个元素 * 不会 * 做到这一点。例如,如果你均匀地将输入分块,那么总是删除最后一个元素将丢失一整块。你必须做一些预先计算来决定是否需要删除它。
gcxthw6b2#
你可以对切片的
len()
上的块迭代器进行filter()
,len()
是你传递给chunks()
的量:从Rust 1.31开始,您也可以使用
chunks_exact
方法:请注意,如果您需要在最后获得不均匀数量的项,则返回的迭代器还具有方法
remainder
。wlwcrazw3#
作为一种替代解决方案,它(可能)比Shepmaster的解决方案性能稍高,而且更简洁,您可以使用
std::iter::DoubleEndedIterator
中的next_back()
方法:next_back()
吃掉迭代器的最后一个元素,所以在调用next_back()
之后,迭代器可以用来迭代其他所有元素。