使用Comparator排序ArrayList失效问题排查
ArrayList按float字段排序失效问题排查与修复
问题根源
排序失效的核心原因是sorter类中compare方法的实现错误:
return (int)(a.getX() - b.getX());
因为测试用的x是rand.nextFloat()生成的0到1之间的浮点数,当两个浮点数的差值绝对值小于1时,强制转换为int会直接截断小数部分得到0。而Comparator规则中,返回0代表两个元素相等,排序算法会认为这些元素不需要调整位置,最终导致排序逻辑完全失效,列表基本保持原始顺序。
修复方案
有两种可靠的修复方式,任选其一即可:
方案1:使用Float类自带的compare方法(推荐)
Java的Float类提供了专门处理浮点数比较的静态方法,能正确返回符合Comparator规则的int值:
class sorter implements Comparator<someObj> { public int compare(someObj a, someObj b) { return Float.compare(a.getX(), b.getX()); } }
方案2:手动判断差值范围
通过判断差值的正负来返回对应结果,避免强制类型转换的精度丢失:
class sorter implements Comparator<someObj> { public int compare(someObj a, someObj b) { float diff = a.getX() - b.getX(); if (diff > 0) { return 1; } else if (diff < 0) { return -1; } else { return 0; } } }
验证效果
修复后执行代码,排序后的输出会按x值从小到大排列,pnt字段保留的原始索引会呈现无序状态,说明排序逻辑已正常生效。
内容的提问来源于stack exchange,提问作者4ulls
相关产品推荐
相关产品推荐

