天天看點

Collections.sort(List, Comparator)方法解析

Collections.sort()方法有兩種參數類型,如下:

Collections.sort(List<T> list),直接給定需要排序的list,然後按照自然排序進行排序。

Collections.sort(List<T> list,Comparator<? super T> c),這個方法需要提供比較器,然後排序時會根據比較器的實作邏輯進行排序。

簡單看一下提供比較器的方法實作,裡面有一段代碼需要注意,這段代碼其實就是最終決定了排序時是升序還是降序。

private static <T> int countRunAndMakeAscending(T[] a, int lo, int hi,
                                                Comparator<? super T> c) {
    assert lo < hi;
    int runHi = lo + 1;
    if (runHi == hi)
        return 1;

    // Find end of run, and reverse range if descending
 if (c.compare(a[runHi++], a[lo]) < 0) { // Descending
 while (runHi < hi && c.compare(a[runHi], a[runHi - 1]) < 0)
            runHi++;
        reverseRange(a, lo, runHi);
    } else {                              // Ascending
 while (runHi < hi && c.compare(a[runHi], a[runHi - 1]) >= 0)
            runHi++;
    }

    return runHi - lo;
}      

看以上代碼,主要關注兩點:

1、使用提供的比較器進行值比較時,傳遞進去的第一個參數是隊列後面的值,傳遞的第二個參數是隊列前面的值

2、即使比較器傳回的是小于0,按照desc方式排序了,但最後會調用reverseRange方法,進行排序反轉,也就是最終都是按大于0的方式進行的排序

以上兩點不難總結出:

1、隊列第一個值大于第二個值的情況下:

  • 比較器中用參數1減去參數2作為結果,實際是隊列中的第二個值減去第一個值,按升序進行排序
  • 比較器中用參數2減去參數1作為結果,實際是隊列中的第一個值減去第二個值,按降序進行排序

2、隊列第一個值小于第二個值的情況下:

  • 比較器中用參數1減去參數2作為結果,實際是隊列中的第二個值減去第一個值,按升序進行排序
  • 比較器中用參數2減去參數1作為結果,實際是隊列中的第一個值減去第二個值,按降序進行排序

針對以上總結,很容易看出,是升序還是降序,其實跟隊列第一個值和第二個值的大小沒有關系,直接和比較器實作的邏輯有關系。

比較器中若是參數1減去參數2作為結果,那就按升序進行排序,否則就是按降序排序

繼續閱讀