整数排序中的坑
Java中对集合或者数组排序一般有两个方法,类实现Comparable 接口或者 排序时使用定制化接口 Comparator。
以TreeSet为例,日常写法:
Set<Integer> sets = new TreeSet<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 == o1 ? 0 : o2 > o1 ? 1 : -1;
}
});
sets.add(1);
sets.add(-1);
sets.add(100);
System.out.println(Arrays.toString(sets.toArray(new Integer[]{})));
//[100, 1, -1]
关于上面的写法,还有一种变种,就是改成o2-o1,似乎没有问题,看源码,使用Comparator的时候,是按照正负进行判断的
坑来了
看例子
Set<Integer> sets = new TreeSet<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
});
sets.add(1);
sets.add(-1);
sets.add(Integer.MIN_VALUE);
System.out.println(Arrays.toString(sets.toArray(new Integer[]{})));
[-2147483648, 1, -1]
是不是不是预想的结果了,-2147483648成了最大值。
原因:
很简单,做个测试 -2147483648 -1 = ? 答案是 2147483648。
数字在边界处会溢出,比如 2147483648+1=-2147483648
最佳实践:
使用Comparator接口工作时,一定使用比较将结果控制在-1 ,0 1 三个值,保证结果稳定,如果使用数字加减排序,有可能因为有数字溢出导致结果异常。
分类:
算法/algorithm
标签:
Java
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体