Java比较器的设计采坑点

前言


在leetcode的刷题中,或是日常的数据处理,竟然需要对数据进行排序。虽然在面向对象的编程中,比较不仅仅局限在几种基本的数量类型,不过到了最底层,还是基本数据类型的比较。

本文主要介绍使用Java中的lamda表达式来实现一个list或是数组的排序。

主要内容

  1. 如果是基本数值类型的比较时,直接使用java自带的比较器, Integer.compare()等
  2. 如果一定要自己实现,建议比大小,而非使用差值来判断,有溢出危险;
  3. 如果第一个大于第二个,返回1,表示的是两个数不改变顺序,默认是升序。—

下面是 leetcode 题目链接 452. 用最少数量的箭引爆气球 的答案。具体解题思路可以点链接看题解。这里着重记录的是用lambda表达式来给二维数组 points排序, 即(e1, e2)->(…) 即为lambda表达式。

一开始 我用(e1[1] - e2[1])作为判断条件,如果大于0, 返回1, 表示升序排序。
然而,考虑题目的输入范围,可以取负数,所以上面的差值,如果是正数 - 负数 = 两个正数和,就会溢出,继而会出现排序错误,最后导致题目出错。

注释处的代码,修改成 e1[1] > e2[1], 直接判断,就不会出错了。

下面正式的代码,是从别人的答案那复制来的,对于基本数据类型,直接调用 Ingeger.compare()是最稳妥的。如果这里想变成降序,改成 Integer.compare(b[1], a[1])即可。这部分没啥技术含量,死记就好。

class Solution {
    public int findMinArrowShots(int[][] points) {
        // 根据每个二元数组的第二个位置排序,升序;
        // 如果后一个的第一位,均小于第一个的第二位,都是一支箭可以解决的
       // 遍历不到了,就算下一个箭
    //    if (points.length == 0){
    //        return 0;
    //    }
    //    int n = points.length;
    //    Arrays.sort(points, (e1, e2)->((e1[1] == e2[1])?0:((e1[1]>e2[1])?1:-1))); // 按第二位升序
       Arrays.sort(points,(a,b)->Integer.compare(a[1],b[1]));
       int prev = points[0][1];
       int total = 1;
       for (int i=1; i < points.length; i++){
           if (points[i][0] > prev){
               prev = points[i][1];
               total++; 
           }
                
       }
       return total;

    }
}

在这里插入图片描述
内存溢出导致的判断错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值