如何重复迭代器的每个元素n次?
我目前正在学习 Rust,我偶然发现了一个操作,我在 std 中找不到标准实现,也找不到合理形成的代码片段,这可以做我想做的事情。
基本上我想重复给定次数的迭代器的每个元素。因此,例如,如果 a 的迭代器为[1,2,3]
,那么例如通过将每个元素重复 3 次,我的意思是输出应该是[1,1,1,2,2,2,3,3,3]
.
如何在 Rust 中惯用地做到这一点?
回答
您可以使用repeat(n).take(n)
重复单个元素flat_map
并将这些重复组合成一个平面迭代器:
let it = vec![1, 2, 3].into_iter();
let repeated = it.flat_map(|n| std::iter::repeat(n).take(3));
assert!(repeated.collect::<Vec<_>>() == vec![1, 1, 1, 2, 2, 2, 3, 3, 3]);
将任何迭代器转换为重复迭代器的通用版本可能如下所示(playground):
fn repeat_element<T: Clone>(it: impl Iterator<Item = T>, cnt: usize) -> impl Iterator<Item = T> {
it.flat_map(move |n| std::iter::repeat(n).take(cnt))
}