Java使用Comparator双字段排序后出现异常全0数据问题求助
问题根因分析
- 核心问题1:
Arrays.sort默认对传入数组的所有元素执行排序,而你仅填充了数组下标1~n的位置,其余下标(比如0、大于n的下标)的Process对象未手动赋值,int类型成员默认值为0,因此这些全0的对象排序后会出现在最前列。 - 核心问题2:你排序前后的打印逻辑仅遍历
1~n的下标,排序前未被赋值的元素不在打印范围内,所以看不到异常;排序后全0元素被重排到1~n的下标区间,打印时就出现了异常数据。
修复方案
方案1(推荐:符合Java数组使用规范)
Java数组默认从0开始索引,建议调整所有逻辑统一使用0下标:
- 填充数组时从下标
0到n-1写入有效数据 - 打印时遍历范围改为
for(int i=0; i<n; i++) - 直接调用
Arrays.sort(array, comparator)排序整个数组即可
方案2(兼容现有1下标逻辑)
如果必须保留1开头的索引使用习惯,使用Arrays.sort的区间排序重载方法,仅排序有效元素区间:
// 第一个参数是数组,第二个是起始下标(包含),第三个是结束下标(不包含),第四个是比较器 Arrays.sort(array, 1, n+1, new Comparator<Process>(){ public int compare(Process p1, Process p2) { int accessCompare = Integer.compare(p1.numAccess, p2.numAccess); return accessCompare != 0 ? accessCompare : Integer.compare(p1.numDelete, p2.numDelete); } });
额外优化建议
你原有的比较器逻辑中手动将int装箱为Integer再调用compareTo,存在不必要的装箱开销,直接使用Integer.compare(int a, int b)静态方法即可直接比较两个int值,性能更好、写法更简洁。
内容的提问来源于stack exchange,提问作者Omia
相关产品推荐
相关产品推荐

