前言
在leetcode的刷题中,或是日常的数据处理,竟然需要对数据进行排序。虽然在面向对象的编程中,比较不仅仅局限在几种基本的数量类型,不过到了最底层,还是基本数据类型的比较。
本文主要介绍使用Java中的lamda表达式来实现一个list或是数组的排序。
主要内容
- 如果是基本数值类型的比较时,直接使用java自带的比较器, Integer.compare()等
- 如果一定要自己实现,建议比大小,而非使用差值来判断,有溢出危险;
- 如果第一个大于第二个,返回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;
}
}
内存溢出导致的判断错误。