假设我们有一个向量:
let a = vec![1, 2, 3];
Run Code Online (Sandbox Code Playgroud)
迭代元素的最佳和最短的方法是什么,以便在第一次迭代中我收到一个元组(1, 2),并在下一次迭代中收到 - (2, 3),直到没有元素,所以不会产生(3, None)或类似的东西?看起来a.chunks(2)有点不同,它以 2 为步长,而我需要在集合中的每两个连续元素上以 1 为步长。
Jas*_*son 25
有多种方法可以做到这一点:
使用标准库:
let result = a.iter()
.zip(a.iter().skip(1))
.inspect(|(a, b)| println!("a: {}, b: {}", a, b))
.collect::<Vec<_>>();
Run Code Online (Sandbox Code Playgroud)
let result = a.windows(2)
.inspect(|w| println!("a: {}, b: {}", w[0], w[1]))
.collect::<Vec<_>>();
Run Code Online (Sandbox Code Playgroud)
值得注意的是,如果这很重要,那就是windows()迭代子切片,所以与上面的方法不同,collect()在这种情况下不会给你一个Vec元组。
使用Itertools板条箱:
use itertools::Itertools;
let result = a.iter()
.tuple_windows()
.inspect(|(a, b)| println!("a: {}, b: {}", a, b))
.collect::<Vec<_>>();
Run Code Online (Sandbox Code Playgroud)
上述所有方法都会打印以下内容:
a: 1, b: 2
a: 2, b: 3
Run Code Online (Sandbox Code Playgroud)
作为奖励,Itertools最近还有一个,它通过包含最后一个 ( ) 和第一个 ( ) 元素.circular_tuple_windows()来执行额外的迭代:31
a: 1, b: 2
a: 2, b: 3
Run Code Online (Sandbox Code Playgroud)
a: 1, b: 2
a: 2, b: 3
a: 3, b: 1
Run Code Online (Sandbox Code Playgroud)
您还可以使用 chunks()。现在元素将不会重叠。
fn main() {
let vec = vec![1, 2, 4, 5, 8, 9];
let new_thing = vec.chunks(2).map(|x| println!("{} and {}", x[0],
x[1])).collect::<Vec<_>>();
}
Run Code Online (Sandbox Code Playgroud)
1 and 2
4 and 5
8 and 9
Run Code Online (Sandbox Code Playgroud)