Java中如何对符合x01-x96规则的数字列表进行自定义排序
实现思路
- 先计算分组总数:每组固定96个元素,直接用总长度除以96即可得到分组数,不需要额外提前统计前缀范围
- 外层循环遍历1~96的后缀序列,内层循环遍历所有分组,依次取出每个分组当前后缀对应的元素加入新列表,即可得到预期排序结果
- 原代码问题:内层循环终止条件
j == groups - 1仅会执行一次,同时偏移量计算未对应后缀遍历逻辑,循环步长设置错误,无法覆盖所有元素
正确Java实现代码
基于原列表顺序实现
// 计算分组总数 int groups = numbersList.size() / 96; List<Long> numbersList2 = new ArrayList<>(); // 外层遍历后缀位:0对应后缀1,95对应后缀96 for (int suffixIndex = 0; suffixIndex < 96; suffixIndex++) { // 内层遍历所有分组 for (int groupIndex = 0; groupIndex < groups; groupIndex++) { // 计算原列表中对应元素的下标:分组起始位置+后缀偏移量 int originIndex = groupIndex * 96 + suffixIndex; numbersList2.add(numbersList.get(originIndex)); } }
基于数值自定义排序实现(不依赖原列表顺序)
如果原列表元素是乱序的,也可以直接通过自定义排序规则得到结果:
numbersList.sort((a, b) -> { // 取后两位作为第一排序维度 int suffixA = a % 100; int suffixB = b % 100; if (suffixA != suffixB) { return Integer.compare(suffixA, suffixB); } // 前缀作为第二排序维度 long prefixA = a / 100; long prefixB = b / 100; return Long.compare(prefixA, prefixB); });
内容的提问来源于stack exchange,提问作者Awni Ahmed
相关产品推荐
相关产品推荐

