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

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下标:

  1. 填充数组时从下标0到n-1写入有效数据
  2. 打印时遍历范围改为for(int i=0; i<n; i++)
  3. 直接调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:39:01