先放一篇别人写的:他山之石
今天做一道题,使用了Arrays.sort并重写Comparator比较器。
之前也做过,知道怎么写,但是具体怎么实现的有点迷糊。
1、Arrays.sort(int[] a)
这个是最基础的,我们都知道可以将数组按从小到大的顺序进行排序。
int[] a = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5};
Arrays.sort(a);
结果:0 1 2 3 4 5 6 7 8 9
2、Arrays.sort(int[] a, int fromIndex, int toIndex)
这个是对数组部分进行排序,对数组a的下标从fromIndex到toIndex-1的元素排序,左闭右开。
int[] a = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5};
Arrays.sort(a, 0, 3);
结果:7 8 9 2 3 4 1 0 6 5 -- 对索引为0到2的元素进行排序
3、public static void sort(T[] a, Comparator<? super T> c)
通常我们会有一些别的排序要求,比如从大到小排序这种。
这个时候,我们就需要重写 Comparator比较器。
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
//注意,要想改变默认的排列顺序,不能使用基本类型(int,double, char)
//而要使用它们对应的类
Integer[] a = {9, 8, 7, 2, 3, 4, 1, 0, 6, 5};
//定义一个自定义类MyComparator的对象
Comparator cmp = new MyComparator();
Arrays.sort(a, cmp);
for(int i = 0; i < a.length; i ++) {
System.out.print(a[i] + " ");
}
}
}
//Comparator是一个接口,所以这里我们自己定义的类MyComparator要implents该接口
//而不是extends Comparator
class MyComparator implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
//如果n1小于n2,我们就返回正值,如果n1大于n2我们就返回负值,
//这样颠倒一下,就可以实现反向排序了
if(o1 < o2) {
return 1;
}else if(o1 > o2) {
return -1;
}else {
return 0;
}
}
}
结果:9 8 7 6 5 4 3 2 1 0
当然,以上代码可以使用简单的一行lambda表达式进行表示。
Arrays.sort(a, (o1, o2) -> (o2 - o1));
正常的话,Comparator比较器对给定的两个操作对象o1, o2,根据比较结果返回正数(o1 > o2)、负数(<)、零(=)。
这样实现的结果是对数组进行从小到大的排序。
重写完是根据比较结果返回 1(o1 < o2)、-1(o1 > o2)与默认相反,
从而实现从大到小的排序。
4、二维
这个是对二维数组intervals按照第二个数的数值进行升序排列。
Arrays.sort(intervals, (a,b) -> (a[1] - b[1]));
//上面可能不够严谨
Arrays.sort(intervals, (a, b) -> (a[1] > b[1] ? 1 : -1));
总结就是整体是比较器是根据返回值的正负来对数组进行排序。
看源码没看懂,sad。