rust - 如何使用迭代器逐个迭代集合中的两个元素?
问题描述
假设我们有一个向量:
let a = vec![1, 2, 3];
迭代元素的最佳和最短的方法是什么,在第一次迭代中我收到一个元组(1, 2)
,在下一次迭代中 - (2, 3)
,直到没有元素,所以不产生(3, None)
或类似的东西?似乎a.chunks(2)
有点不同,它一步一步,而我需要在集合中的每两个连续元素上一步一步。
解决方案
有多种方法可以做到这一点:
使用标准库:
let result = a.iter()
.zip(a.iter().skip(1))
.inspect(|(a, b)| println!("a: {}, b: {}", a, b)
.collect::<Vec<_>>();
let result = a.windows(2)
.inspect(|w| println!("a: {}, b: {}", w[0], w[1]))
.collect::<Vec<_>>();
值得注意的是,如果这很重要,那就是windows
迭代子切片,因此与上述方法不同,collect()
在这种情况下不会给你一个Vec
元组。
使用Itertools
板条箱:
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()
来执行额外的迭代:3
1
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
推荐阅读
- css - 如果下拉下拉-“向上”,JavaFX ComboBox 边框是错误的
- oauth-2.0 - Kong OAuth2 插件客户端凭据流 provision_key 未验证
- asp.net - http 内容显示在 asp.net 应用程序中
- javascript - ElectronJS BrowserWindow FOUC
- python-3.x - 如何将作为排行榜的文本文件限制为五个名称,并根据点数对它们进行排序
- java - 如何在 Spring 应用程序中存储从另一个系统检索到的令牌?
- rabbitmq - Spring RabbitMQ - 在 MessageListener 中获取 ClassCastException
- mysql - 如果这个 MySQL 存储过程使用准备好的语句,它是否仍然存在 SQL 注入的风险?
- reactjs - 更新列表时未触发 react-animated-css
- python - 熊猫多个分组到json