使用Comparator排序TreeNode时-2147483648排序异常如何解决
错误原因
Java中int是32位有符号整数,取值范围为[-2147483648, 2147483647],你在compare方法中直接返回a.val - b.val的写法会触发整数溢出:
当b.val为-2147483648(int类型最小值),和任意正整数a.val做减法时,a.val - (-2147483648)的结果会超出int的最大值上限,溢出后结果变为负数,会让Comparator错误判定a的排序优先级高于b。你的场景中就因为这个问题,导致最小值-2147483648被错误排到了序列末尾。
修复方案
以下三种方案都可以规避整数溢出问题,实现正确排序:
- 调用JDK内置的
Integer.compare方法完成比较(兼容性最好,推荐使用)
Collections.sort(list,new Comparator<>(){ public int compare(TreeNode a,TreeNode b) { return Integer.compare(a.val, b.val); } });
- Java 8及以上版本可以使用更简洁的Comparator构造写法
Collections.sort(list, Comparator.comparingInt(node -> node.val));
- 手动实现大小判断逻辑,全程不使用减法运算
Collections.sort(list,new Comparator<>(){ public int compare(TreeNode a,TreeNode b) { if (a.val < b.val) return -1; if (a.val > b.val) return 1; return 0; } });
内容的提问来源于stack exchange,提问作者LUs3r
相关产品推荐
相关产品推荐

