首页 > 解决方案 > 如何使用迭代器逐个迭代集合中的两个元素?

问题描述

假设我们有一个向量:

let a = vec![1, 2, 3];

迭代元素的最佳和最短的方法是什么,在第一次迭代中我收到一个元组(1, 2),在下一次迭代中 - (2, 3),直到没有元素,所以不产生(3, None)或类似的东西?似乎a.chunks(2)有点不同,它一步一步,而我需要在集合中的每两个连续元素上一步一步。

标签: rustiterator

解决方案


有多种方法可以做到这一点:

使用标准库:

.zip

let result = a.iter()
    .zip(a.iter().skip(1))
    .inspect(|(a, b)| println!("a: {}, b: {}", a, b)
    .collect::<Vec<_>>();

.windows

let result = a.windows(2)
    .inspect(|w| println!("a: {}, b: {}", w[0], w[1]))
    .collect::<Vec<_>>();

值得注意的是,如果这很重要,那就是windows迭代子切片,因此与上述方法不同,collect()在这种情况下不会给你一个Vec元组。

使用Itertools板条箱:

.tuple_windows

use itertools::Itertools;

let result = a.iter()
    .tuple_windows()
    .inspect(|(a, b)| println!("a: {}, b: {}", a, b))
    .collect::<Vec<_>>();

上述所有方法都将打印以下内容:

a: 1, b: 2
a: 2, b: 3

作为奖励,Itertools最近还有一个,它通过包含最后一个 ( ) 和第一个 ( ) 元素.circular_tuple_windows()来执行额外的迭代:31

use itertools::Itertools;

let result = a.iter()
    .circular_tuple_windows()
    .inspect(|(a, b)| println!("a: {}, b: {}", a, b))
    .collect::<Vec<_>>();
a: 1, b: 2
a: 2, b: 3
a: 3, b: 1

推荐阅读