JAVA Guava排序器Ordering原理代碼

一 創(chuàng)建排序器

排序器:可以用來(lái)為構(gòu)建復(fù)雜的比較器,以完成集合排序的功能:
本質(zhì)上來(lái)說(shuō),Ordering 實(shí)例無(wú)非就是一個(gè)特殊的Comparator 實(shí)例。
Ordering把很多基于Comparator的靜態(tài)方法(如Collections.max)包裝為自己的實(shí)例方法(非靜態(tài)方法),
并且提供了鏈?zhǔn)秸{(diào)用方法,來(lái)定制和增強(qiáng)現(xiàn)有的比較器

//創(chuàng)建排序器
  @Test
  public void createOreing(){
    //對(duì)可排序類型做自然排序,如數(shù)字按大小,日期按先后排序
    Ordering<Comparable> natural = Ordering.natural();
    //按對(duì)象的字符串形式做字典排序
    Ordering.usingToString();
    //把給定的Comparator轉(zhuǎn)化為排序器或者繼承Ordering實(shí)現(xiàn)自定義排序器
    Ordering<Integer> from = Ordering.from((Integer x, Integer y) -> Ints.compare(x, y));
    System.out.println(from.max(5, 6));
  }

二 擴(kuò)展排序器,變換成其他功能排序器

//衍生其他排序器
  @Test
  public void anotherOreing(){
    Ordering<Comparable> natural = Ordering.natural();
    natural.max(1, 2); //2
    //獲取語(yǔ)義相反的排序器
    natural.reverse().max(1, 2); //1
    List<Integer> list = Lists.newArrayList(5, 9, 3, 7, 4);
    Collections.sort(list,natural.nullsFirst()); //使用排序器對(duì)集合排序
    list.forEach(x-> System.out.print(x+", ")); //3, 4, 5, 7, 9
 
    // 不使用這兩個(gè)排序器,排序元素不能為null,否則會(huì)報(bào)空指針
    natural.nullsFirst();//使用當(dāng)前排序器,并把null值排到最前
    natural.nullsLast();//使用當(dāng)前排序器,并把null值排到最后
 
    natural.compound(natural);//合成另一個(gè)比較器,以處理當(dāng)前排序器中的相等情況,即添加第二個(gè)比較器
 
    //onResultOf:將function應(yīng)用在各個(gè)元素上之后, 在使用原始o(jì)rdering進(jìn)行排序
    Collections.sort(list,natural.onResultOf(x->x*(-1)));//元素變?yōu)樨?fù)數(shù)再排序
    list.forEach(x-> System.out.print(x+", ")); //9, 7, 5, 4, 3
  }

三 使用排序器

//使用排序器
  @Test
  public void operOrdering(){
    Ordering<Comparable> natural = Ordering.natural();
    List<Integer> list02 = Lists.newArrayList(6,4,9,3,1,5,3);
    /**
     * greatestOf: 獲取可迭代對(duì)象中最大的k個(gè)元素,并按從大到小排序,返回一個(gè)集合
     * leastOfL獲取最小的幾個(gè),并按從小到大排序
     */
    natural.greatestOf(list02,1).forEach(x-> System.out.println(x)); //9
    natural.leastOf(list02,1).forEach(x-> System.out.println(x)); //1
    //返回集合的一個(gè)排好序的副本
    natural.sortedCopy(list02);
    natural.immutableSortedCopy(list02); //返回不可變的排序副本
    /**
     * isOrdered: 判斷是否已經(jīng)按排序器有序,元素不能少于2,允許有相等元素
     * isStrictlyOrdered: 是否嚴(yán)格排序,不允許有相等元素
     */
    Collections.sort(list02,natural);
    natural.isOrdered(list02);//true
    natural.isStrictlyOrdered(list02); //false
    //其他直接比較元素
    natural.compare(1,2);natural.max(5,6);natural.min(list02);
  }
             關(guān)注小編持續(xù)更新中?。。。?! 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1.1-使用和避免null 輕率地使用null可能會(huì)導(dǎo)致很多令人驚愕的問(wèn)題。通過(guò)學(xué)習(xí)Google底層代碼庫(kù),我們發(fā)...
    小雞在路上閱讀 34,166評(píng)論 0 3
  • google-guava被譽(yù)為是JAVA里面的瑞士軍刀。能簡(jiǎn)化我們的代碼,讓我們的代碼易寫、易讀、易于維護(hù)。...
    tuacy閱讀 9,956評(píng)論 0 8
  • 對(duì)于集合來(lái)說(shuō),排序是一個(gè)很常見(jiàn)的操作,Java已經(jīng)提供了一系列排序的方法,如Collections中的靜態(tài)方法...
    ChimeEmail團(tuán)隊(duì)閱讀 1,951評(píng)論 0 2
  • 一、使用和避免null 1、為什么要避免使用null呢? 2、使用null的正確場(chǎng)景 3、Guava給出的措施 4...
    拾壹北閱讀 615評(píng)論 0 1
  • 1.簡(jiǎn)介 Ordering 實(shí)例無(wú)非就是一個(gè)特殊的Comparator 實(shí)例。Ordering只是需要依賴于一個(gè)比...
    cyrilsun閱讀 1,021評(píng)論 0 48

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