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

如何在C#中使用LINQ按数字位数对int类型数据分组

嘿,这个按位数分组排序的需求很明确,我来给你一步步解决!先从你提供的示例数组入手,先看看最终的效果,再给你两种实现方案~

需求回顾

我们需要把0-100之间的int数字按位数(1位、2位、3位)分组,同时满足两个要求:

  • 分组本身按位数升序排列(1位组在前,接着2位,最后3位)
  • 每个组内的数字也按升序排列
示例结果展示

先给你看示例数组处理后的最终结果,直观感受下:

原数组:int[] numbers = new int[] { 100, 5, 88, 6, 45, 12, 34, 11, 6, 17, 35, 55, 54, 34, 7, 12, 33, 2, 41, 5 };

处理后分组:

  • 1位数字:2, 5, 5, 6, 6, 7
  • 2位数字:11, 12, 12, 17, 33, 34, 34, 35, 41, 45, 54, 55, 88
  • 3位数字:100
代码实现(Java)

下面给你两种Java实现方案,分别适合追求简洁和需要理解底层逻辑的场景:

方法一:使用Stream API(简洁版)

Stream API能让代码更紧凑,一行链式调用就能完成分组和排序:

import java.util.*;
import java.util.stream.Collectors;

public class NumberGrouping {
    public static void main(String[] args) {
        int[] numbers = new int[] { 100, 5, 88, 6, 45, 12, 34, 11, 6, 17, 35, 55, 54, 34, 7, 12, 33, 2, 41, 5 };
        
        // 核心逻辑:按位数分组,同时保证分组和组内的升序
        Map<Integer, List<Integer>> groupedNumbers = Arrays.stream(numbers)
                .boxed() // 把int转成Integer,方便集合处理
                .collect(Collectors.groupingBy(
                        num -> String.valueOf(num).length(), // 用字符串长度判断位数,简单直观
                        TreeMap::new, // 用TreeMap自动按位数升序排序分组
                        Collectors.collectingAndThen(Collectors.toList(), list -> {
                            list.sort(Integer::compareTo); // 组内数字升序排序
                            return list;
                        })
                ));
        
        // 输出结果
        groupedNumbers.forEach((digitCount, nums) -> {
            System.out.printf("%d位数字:%s%n", digitCount, nums);
        });
    }
}

方法二:手动循环实现(易懂版)

如果是初学者,手动循环的方式更便于理解每一步的逻辑:

import java.util.*;

public class NumberGroupingManual {
    public static void main(String[] args) {
        int[] numbers = new int[] { 100, 5, 88, 6, 45, 12, 34, 11, 6, 17, 35, 55, 54, 34, 7, 12, 33, 2, 41, 5 };
        
        // 用TreeMap保证分组按位数从小到大排列
        Map<Integer, List<Integer>> groups = new TreeMap<>();
        
        // 第一步:遍历所有数字,按位数分组
        for (int num : numbers) {
            int digitCount = String.valueOf(num).length();
            // 如果当前位数的组不存在,就创建一个新的ArrayList
            groups.computeIfAbsent(digitCount, k -> new ArrayList<>()).add(num);
        }
        
        // 第二步:对每个组内的数字进行升序排序
        for (List<Integer> group : groups.values()) {
            Collections.sort(group);
        }
        
        // 第三步:输出分组结果
        for (Map.Entry<Integer, List<Integer>> entry : groups.entrySet()) {
            System.out.printf("%d位数字:%s%n", entry.getKey(), entry.getValue());
        }
    }
}
关键细节说明
  • 判断位数的方式:用String.valueOf(num).length()是最直观的,避免了数学计算(比如Math.log10(num)+1)的边界问题(比如0或者100这种特殊值)
  • 分组升序:使用TreeMap存储分组,它会自动按key(位数)的自然顺序排序,省去了手动排序分组的步骤
  • 组内排序:无论是用list.sort()还是Collections.sort(),都是基于Integer的自然排序,保证数字从小到大排列

内容的提问来源于stack exchange,提问作者Frontmaniaac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:52:45