1. 程式人生 > 程式設計 >Java Guava排序器Ordering原理及程式碼例項

Java Guava排序器Ordering原理及程式碼例項

一 建立排序器

排序器:可以用來為構建複雜的比較器,以完成集合排序的功能:

本質上來說,Ordering 例項無非就是一個特殊的Comparator 例項。

Ordering把很多基於Comparator的靜態方法(如Collections.max)包裝為自己的例項方法(非靜態方法),

並且提供了鏈式呼叫方法,來定製和增強現有的比較器

//建立排序器
  @Test
  public void createOreing(){
    //對可排序型別做自然排序,如數字按大小,日期按先後排序
    Ordering<Comparable> natural = Ordering.natural();
    //按物件的字串形式做字典排序
    Ordering.usingToString();
    //把給定的Comparator轉化為排序器或者繼承Ordering實現自定義排序器
    Ordering<Integer> from = Ordering.from((Integer x,Integer y) -> Ints.compare(x,y));
    System.out.println(from.max(5,6));
  }

二 擴充套件排序器,變換成其他功能排序器

//衍生其他排序器
  @Test
  public void anotherOreing(){
    Ordering<Comparable> natural = Ordering.natural();
    natural.max(1,2); //2
    //獲取語義相反的排序器
    natural.reverse().max(1,2); //1
    List<Integer> list = Lists.newArrayList(5,9,3,7,4);
    Collections.sort(list,natural.nullsFirst()); //使用排序器對集合排序
    list.forEach(x-> System.out.print(x+",")); //3,4,5,9

    // 不使用這兩個排序器,排序元素不能為null,否則會報空指標
    natural.nullsFirst();//使用當前排序器,並把null值排到最前
    natural.nullsLast();//使用當前排序器,並把null值排到最後

    natural.compound(natural);//合成另一個比較器,以處理當前排序器中的相等情況,即新增第二個比較器

    //onResultOf:將function應用在各個元素上之後,在使用原始ordering進行排序
    Collections.sort(list,natural.onResultOf(x->x*(-1)));//元素變為負數再排序
    list.forEach(x-> System.out.print(x+",")); //9,3
  }

三 使用排序器

//使用排序器
  @Test
  public void operOrdering(){
    Ordering<Comparable> natural = Ordering.natural();
    List<Integer> list02 = Lists.newArrayList(6,1,3);
    /**
     * greatestOf: 獲取可迭代物件中最大的k個元素,並按從大到小排序,返回一個集合
     * leastOfL獲取最小的幾個,並按從小到大排序
     */
    natural.greatestOf(list02,1).forEach(x-> System.out.println(x)); //9
    natural.leastOf(list02,1).forEach(x-> System.out.println(x)); //1
    //返回集合的一個排好序的副本
    natural.sortedCopy(list02);
    natural.immutableSortedCopy(list02); //返回不可變的排序副本
    /**
     * isOrdered: 判斷是否已經按排序器有序,元素不能少於2,允許有相等元素
     * isStrictlyOrdered: 是否嚴格排序,不允許有相等元素
     */
    Collections.sort(list02,natural);
    natural.isOrdered(list02);//true
    natural.isStrictlyOrdered(list02); //false
    //其他直接比較元素
    natural.compare(1,2);natural.max(5,6);natural.min(list02);
  }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。