1. 程式人生 > >Guava之Ordering比較器

Guava之Ordering比較器

簡介

Ordering是Guava類庫提供的一個犀利強大的比較器工具,Guava的Ordering和JDK Comparator相比功能更強。它非常容易擴充套件,可以輕鬆構造複雜的comparator,然後用在容器的比較、排序等操作中。 本質上來說,Ordering 例項無非就是一個特殊的Comparator 例項。Ordering只是需要依賴於一個比較器(例如,Collections.max)的方法,並使其可作為例項方法。另外,Ordering提供了鏈式方法呼叫和加強現有的比較器。

下面我們看看Ordering中的一些具體方法和簡單的使用例項。

常見的靜態方法

方法 備註
natural() 使用Comparable型別的自然順序, 例如:整數從小到大,字串是按字典順序
usingToString() 使用toString()返回的字串按字典順序進行排序
arbitrary() 返回一個所有物件的任意順序, 即compare(a, b) == 0 就是 a == b (identity equality)。 本身的排序是沒有任何含義, 但是在VM的生命週期是一個常量

使用

以下示例程式碼中使用到的People類包含name和age兩個屬性。

natural()

該方法使用自然排序規則生成排序器,如從小到大、日期先後順序。使用這個方法之前先介紹一下onResultOf 方法,這個方法接收一個Function函式,該函式的返回值可以用於natural方法排序的依據,即根據這個返回值來進行自然排序

,示例程式碼如下:

public class testNatural {

    public static void main(String[] args) {
        List<People> peopleList = new ArrayList<People>() {{
            add(new People("A", 33));
            add(new People("B", 11));
            add(new People("C", 18));
        }};
        Ordering<People> ordering = Ordering.natural().onResultOf(new Function<People, Comparable>() {
            @Override
            public Comparable apply(People people) {
                return people.getAge();
            }
        }).reverse();

        for (People people : peopleList) {
            System.out.println(people.getName() + " " + people.getAge());
        }

        for (People p : ordering.sortedCopy(peopleList)) {
            System.out.println(p.getName() + " " + p.getAge());
        }

        for (People people : peopleList) {
            System.out.println(people.getName() + " " + people.getAge());
        }
    }
}

sortedCopy方法會使用建立的排序器排序並生成一個新的List。對於Ordering.natural().onResultOf方法,閱讀順序是從後往前,即根據onResultOf 方法的返回值按照自然規則建立一個Ordering,然後呼叫sortedCopy方法排序並生成新List。輸出結果如下:

People{name=B, age=11}
People{name=C, age=18}
People{name=A, age=33}

reverse()

這個方法使用反向的排序規則來排序,即若使用natural規則建立Ordering後,再接著呼叫reverse方法,則按照自然規則的反向,從大到小的規則排序,示例程式碼

usingToString()

該方法建立Ordering,並根據排序依據值的toString方法值來使用natural規則排序

from()

該方法接收一個自定義的Comparator比較器來建立Ordering,根據Comparator中的自定義規則排序

應用

     BrandShopUgcExecutor brandShopUgcExecutor = new BrandShopUgcExecutor();
        OrderByWeight orderByWeight = brandShopUgcExecutor.new OrderByWeight();
        OrderByFollowNote orderByFollowNote = brandShopUgcExecutor.new OrderByFollowNote();
        //定義筆記器
        Ordering<ReviewData> ordering = Ordering.from(orderByWeight).compound(orderByFollowNote);
        //排序
        Collections.sort(reviewDataList, ordering);
        List<Integer> reviewIdList = Lists.newArrayList();
        for (ReviewData reviewData : reviewDataList) {
            reviewIdList.add(reviewData.getReviewId());
        }
        return reviewIdList;
    }