尝试使用比较器对[5,3,9,-2147483648,2]进行排序,其中值为TreeNode
树节点结构:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
以下是我的代码:
Collections.sort(list,new Comparator<>(){
public int compare(TreeNode a,TreeNode b)
{
return a.val-b.val;
}
});
这里的列表是树节点的集合
实际输出:2,3,5,9,-2147483648
预期产量:-214748368,2,3,5,9
return a.val-b.val;
与所有整数算术一样,如果操作数过大,则会发生溢出。
相反,您可以使用:
return Integer.compare(a.val, b.val);
或者,更好的是,使用辅助方法构建Comparator
:
list.sort(Comparator.comparingInt(a -> a.val));
所以发生这种情况是因为算术运算的结果溢出了Integer
允许的最大数。
当在某个点进行比较时,循环执行return 9 - (-2147483648)
,返回大于整数2147483647
支持的最大值的2147483657
。
避免这些情况的最佳选择是使用Java提供的方法Integer.compare(a,b)
,正如@andy turner在他的回答中提到的那样。