关于Comparator()的使用,Lambda简单写法的踩坑记录

在使用Arrays.sort进行排序时,通过lambda表达式(a[1]-b[1])可能导致int类型溢出,从而产生错误的排序结果。正确做法是直接比较元素大小,避免数值运算。文章通过一个测试用例说明了这个问题,并提供了修正后的排序代码示例。
摘要由CSDN通过智能技术生成

今天刷题,碰到了一个问题。
需要对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;
    }
});

上面第一种方法确实简便,只需要一行,由于之前刷题都是第一种方法,这次碰到了硬茬后才真正明白了第二种方法存在的意义捏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值