You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:09:24