fn main() {
let mut range = (0..=63).into_iter();
let iter = std::iter::from_fn(|| Some([range.next()?, range.next_back()?])).flatten();
dbg!(iter.collect::<Vec<_>>());
}
let range = 0..=63;
let len = range.end() - range.start() + 1;
let iter = itertools::interleave(
range.clone().take((len + 1) / 2),
range.clone().rev().take(len / 2),
);
3条答案
按热度按时间68de4m5k1#
这里有一种只使用标准库的方法,它需要一个
DoubleEndedIterator
,并且对于奇数大小的迭代器会跳过最后一项:输出量:
Playground
@Finomnis has posted a solution,以防您的输入包含奇数个项目。
pnwntuvh2#
此解决方案适用于实现
DoubleEndedIterator
的所有迭代器:注意,这个解决方案保证返回所有项,不管迭代器包含的是偶数还是奇数。
第一个
其思想是存储下一项应该是从前面还是从后面,然后在每次迭代中翻转它。
from_fn
可以接受FnMut
,也就是说,它可以接受存储内部状态的闭包。这个闭包中的内部状态由变量iter
和from_front
组成,它们通过move ||
关键字被移动到闭包中。dbf7pr2w3#
您可以使用
itertools::interleave
来交错正向和反向迭代器。RangeInclusive<i32>
没有实现ExactSizedIterator
,所以没有.len()
函数,我们必须自己计算。(len + 1)
,额外的项将显示在前半部分。Playground