一维数组
自定义排序方法:
Arrays.sort(arr, new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return b-a;
}
});
Arrays.sort(arr, (a, b) -> (b - a));
问题: 可以试着把arr赋值为以下值: 也就是int的边界值
Integer[] arr = {-2147483648, 1, 2147483647};
代码:
Integer[] arr = {-2147483648, 1, 2147483647};
Arrays.sort(arr, new Comparator<Integer>() {
public int compare(Integer a, Integer b) {
return b-a;
}
});
for(Integer item : arr) {
System.out.print(item+" ");
}
结果:并不是降序
-2147483648 2147483647 1
这是因为自定义排序内是相减的操作,int边界上的值相加减可不一定在int范围内。
解决:
Arrays.sort(arr, Comparator.reverseOrder());
或
Arrays.sort(arr, (a, b) -> Integer.compare(b, a));
两种方式都可以 解决 上述出现的问题
Integer[] arr = {-2147483648, 1, 2147483647};
Arrays.sort(arr, Comparator.reverseOrder());
for(Integer item : arr) {
System.out.print(item+" ");
}
结果:
2147483647 1 -2147483648
?
二维数组
int[][] people = {{7,0},{4,4},{7,1},{5,0},{6,1},{5,2}};
Arrays.sort(people, (a, b) -> {
if (a[0] == b[0]) return a[1] - b[1];
return b[0] - a[0];
});
for(int[] a : people) {
System.out.println(a[0]+" "+a[1]);
}
很容易得出上述代码的功能,根据二维数组的第一个元素降序排序,如果第一个元素相同,则按照第二个元素升序。 结果:
7 0
7 1
6 1
5 0
5 2
4 4
当然相减的排序方式难免不适用于边界数据,只要采用上述一维数组那样的方式就好了。
形式:
Arrays.sort(points, (o1, o2) -> Integer.compare(o1[0], o2[0]));
那么就可以改写为:
Arrays.sort(people, (o1, o2) -> {
if(o1[0] == o2[0])return Integer.compare(o1[1], o2[1]);
return Integer.compare(o2[0], o1[0]);
});
|