如何在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
相关产品推荐
相关产品推荐

