Collections.sort和Arrays.sort自定义排序/部分排序

和C++极为相似。

一.Arrays.sort

1.自定义排序

A.一维数组+类(一般包含两个属性)

        //start不等的话先从小到大,start相等的话再按end从小到大
        Interval[] a = new Interval[];  //先转化为数组
        Arrays.sort(a, new Comparator<Interval>() {
            public int compare(Interval i1, Interval i2) {
                if (i1.start == i2.start) {
                    return i1.end - i2.end;
                }
                return i1.start - i2.start;
            }
        });

B.二维数组

//法一:
Arrays.sort(envelopes, (a, b) -> (a[0] - b[0]));//按第一列升序排列,第二列不变 
Arrays.sort(envelopes,(a, b) -> a[0]==b[0]?(a[1]-b[1]):(a[0]-b[0]));////按第一列升序排列,然后按第二列升序排列

//法二:
Arrays.sort(intervals, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        return o1[0] - o2[0];
    }
});
2.部分元素排序
Arrays.sort(int[] a, int fromIndex, int toIndex)

二.Collections.sort

1.自定义排序
    Collections.sort(intervals,new Comparator<Interval>() {
            public int compare(Interval i1, Interval i2) {
                if(i1.start == i2.start) {
                    return i1.end - i2.end;
                }
                return i1.start - i2.start;
            }
        });

看了下源码,Collections.sort先把collection转化为数组,然后调用Arrays.sort,而Arrays.sort主要调用TimSort(优化版的归并排序)

//从小到大,但前面相同且length较长的比较大
//"abc"<"abcd","abdf"<"abc"
 Collections.sort(ans, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
2.部分元素排序
Collections.sort(list.subList(start, end));//对sublist的修改会体现在父亲身上,sublist保存的是父对象

ref:https://www.cnblogs.com/warehouse/p/9342279.html