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, 7, 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, 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: 獲取可迭代對象中最大的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);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM