Java8_常用排序方法

靜態(tài)方法 Comparator.comparing 返回一個(gè) Comparator 對象,該對象提供了一個(gè)函數(shù)可以提取排序
關(guān)鍵字。

新的實(shí)例方法包含了下面這些。

  • reversed ——對當(dāng)前的 Comparator 對象進(jìn)行逆序排序,并返回排序之后新的
    Comparator 對象。
  • thenComparing ——當(dāng)兩個(gè)對象相同時(shí),返回使用另一個(gè) Comparator 進(jìn)行比較的
    Comparator 對象。
  • thenComparingInt 、 thenComparingDouble 、 thenComparingLong ——這些方法的
    工作方式和 thenComparing 方法類似,不過它們的處理函數(shù)是特別針對某些基本數(shù)據(jù)類型(分別對應(yīng)于 ToIntFunction 、 ToDoubleFunction 和 ToLongFunction )的。

新的靜態(tài)方法包括下面這些。

  • comparingInt 、 comparingDouble 、 comparingLong ——它們的工作方式和 comparing 類似,但接受的函數(shù)特別針對某些基本數(shù)據(jù)類型(分別對應(yīng)于 ToIntFunction 、
    ToDoubleFunction 和 ToLongFunction )。

  • naturalOrder ——對 Comparable 對象進(jìn)行自然排序,返回一個(gè) Comparator 對象。

  • nullsFirst 、 nullsLast ——對空對象和非空對象進(jìn)行比較,你可以指定空對象(null)
    比非空對象(non-null)小或者比非空對象大,返回值是一個(gè) Comparator 對象。

  • reverseOrder ——和 naturalOrder().reversed() 方法類似。

按照給定的集合順序?qū)δ繕?biāo)集合進(jìn)行排序

List<String> list1 = new ArrayList<>();
list1.add("7388345e");
list1.add("982c504e");
list1.add("e5a90522");
list1.add("4445e195");

List<String> list2 = new ArrayList<>();
list2.add("4445e195");
list2.add("f87775bc");
list2.add("7388345e");
list2.add("443c55a4");
list2.add("e5a90522");
list2.add("982c504e");

// list1.sort(Comparator.comparingInt(list2::indexOf));

list1 = list1.stream()
    .sorted(Comparator.comparingInt(list2::indexOf))
    .collect(Collectors.toList());
System.out.println(list1);

/** list1是目標(biāo)集合, 按照list2的順序進(jìn)行排序 
返回結(jié)果:
    [4445e195, 7388345e, e5a90522, 982c504e]
*/

逆序

// 源碼
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
            Function<? super T, ? extends U> keyExtractor) {
    Objects.requireNonNull(keyExtractor);
    return (Comparator<T> & Serializable)
        (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
// 錯(cuò)誤寫法
list1.sort(Comparator.comparing(val -> val.substring(1,2)).reversed());

編譯不會(huì)通過, Connot resolve method 'substring' in 'Object'

Lambda的類型是從使用Lambda的上下文推斷出來的,這里的 val 會(huì)被解析成Object,當(dāng)然找不到 substring。

錯(cuò)誤編寫
// 正確寫法
list1.sort(Comparator.comparing((String val) -> val.substring(1,2)).reversed());

/** 返回結(jié)果: 
    [982c504e, e5a90522, 4445e195, 7388345e]
*/

比較器鏈

list1.sort(Comparator.comparing((String val) -> val.substring(val.length() - 1))
           .reversed()
           .thenComparing((String val) -> val.substring(val.length() - 2)));

/**
    先按照最后一位逆序, 如果最后一位相同, 再按照倒數(shù)第二位排序
    [982c504e, 7388345e, 4445e195, e5a90522]
*/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容