Arrays.sort详解

先放一篇别人写的:他山之石

今天做一道题,使用了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。
上一篇:【Java基础】Comparable和Comparator两种比较器的区别(原理+实现)


下一篇:集合转map 排序