我想将Vec
分成等长的部分,然后map
。我有一个调用Vec
chunks()
方法的迭代器。这可能会让我的部分比其他部分小,这将是它产生的最后一个元素。
为了确保所有部分都具有相同的长度,我只想删除最后一个元素,然后在左边的内容上调用map()
。
答案 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
。