今天刷题,碰到了一个问题。
需要对points[][]二维数组按照第二个元素从小到大排序,于是使用了
Arrays.sort(points, (a, b) -> (a[1] - b[1]));
但碰到了如下测试用例,排序结果错误:
points = [[-2147483646,-2147483645],[2147483646,2147483647]]
排序结果反过来了:
[[2147483646,2147483647],[-2147483646,-2147483645]]
思虑再三,发现了问题所在:
上面排序所使用的lambda表达式中,将两个元素相减来比较大小,由于元素类型是int,元素相减可能会溢出,导致排序结果错误。
正确的使用方法应该直接比较大小,然后直接赋值:
Arrays.sort(points, (a, b) -> {
if(a[1] < b[1]){
return -1;
}else if(a[1] > b[1]){
return 1;
}else{
return 0;
}
});
上面第一种方法确实简便,只需要一行,由于之前刷题都是第一种方法,这次碰到了硬茬后才真正明白了第二种方法存在的意义捏。