如何在Rust中对向量中的连续整数进行分组?
如何用Rust将Vec中的连续整数分组
嘿,这个需求我之前也碰到过,用itertools的group_by确实是个好思路,但关键是得找对分组的key——直接用元素本身肯定不行,得换个逻辑让连续的数落到同一个分组里!
方法一:使用itertools库
首先需要在Cargo.toml中添加依赖:
[dependencies] itertools = "0.12"
然后实现代码:
use itertools::Itertools; fn main() { let v = vec![1, 2, 3, 5, 6, 7, 9, 10]; // 核心逻辑:用num - idx作为分组key let groups: Vec<Vec<i64>> = v.into_iter() .enumerate() // 给每个元素加上索引 .group_by(|&(idx, num)| num - idx as i64) // 按计算后的key分组 .into_iter() .map(|(_key, group)| group.map(|(_idx, num)| num).collect()) // 提取出原数字组成分组 .collect(); println!("{:?}", groups); // 输出: [[1, 2, 3], [5, 6, 7], [9, 10]] }
逻辑说明
举个例子:
- 前三个元素
1,2,3对应的索引是0,1,2,计算num - idx得到1,1,1,属于同一个key,所以被分到一组 - 接下来的
5,6,7索引是3,4,5,计算得5-3=2、6-4=2、7-5=2,也是同一个key - 最后
9,10索引是6,7,计算得9-6=3、10-7=3,同样归为一组
这样group_by就能精准把连续整数聚在一起了。
方法二:原生Rust实现(无需第三方库)
如果不想引入依赖,也可以用原生的循环来实现:
fn group_consecutive_numbers(numbers: Vec<i64>) -> Vec<Vec<i64>> { let mut groups = Vec::new(); if numbers.is_empty() { return groups; } // 初始化第一个分组 let mut current_group = vec![numbers[0]]; for &num in numbers.iter().skip(1) { // 如果当前数字是分组最后一个数字+1,就加入当前分组 if num == *current_group.last().unwrap() + 1 { current_group.push(num); } else { // 否则把当前分组存入结果,新建分组 groups.push(current_group); current_group = vec![num]; } } // 别忘了把最后一个分组加进去 groups.push(current_group); groups } fn main() { let v = vec![1, 2, 3, 5, 6, 7, 9, 10]; let result = group_consecutive_numbers(v); println!("{:?}", result); // 输出: [[1, 2, 3], [5, 6, 7], [9, 10]] }
这个方法逻辑更直观:遍历数组,维护当前的连续分组,遇到不连续的数字就结束当前分组,开始新的分组。
内容的提问来源于stack exchange,提问作者Sergey Yakovlev
相关产品推荐
相关产品推荐

