use std::iter::repeat;
fn main() {
let iter = [1, 2, 3, 4].into_iter();
let len = iter.len();
let res: Vec<u8> = iter
.enumerate()
.map(|(i, x)| repeat(x).take((i == 0 || i == len - 1).then(|| 2).unwrap_or(1)))
.flatten()
.collect();
assert_eq!(res, vec![1, 1, 2, 3, 4, 4]);
}
3条答案
按热度按时间axr492tv1#
你也可以选择自己的,如果你想:
这里唯一奇怪的边缘情况是只有一个元素的原始迭代器。目前还不清楚这里正确的行为是什么,但
FristLastRepeat
将产生三次,这似乎在任何情况下都不正确。不过,这是可以解决的。tyu7yeag2#
我不知道在
std
或itertools
中有什么方法可以做到这一点。你可以合并多个迭代器方法来实现这一点,不过:Playground.
请注意,重复最后一个元素两次需要我们事先知道迭代器的大小,因此迭代器类型必须实现
ExactSizeIterator
,或者必须提供一些其他方法来获得长度。qaxu7uf23#
最后我自己卷了起来。这比isaactfa的方法稍微好一点,因为它不需要
FusedIterator
,而且代码量也差不多。