餓了麼開源專案:Java Comparator生成器

小飛_Xiaofei發表於2016-05-13

版權所有。所有權利保留。

歡迎轉載,轉載時請註明出處:

http://blog.csdn.net/xiaofei_it/article/details/51399159


公司Android專案裡經常需要對元素進行排序,而排序都是多欄位的,相應的Comparator比較難寫。於是我就寫了這麼一個工具類,使用者只需要指定排序規則,便可以自動生成相應的Comparator。


專案地址:

https://github.com/Xiaofei-it/ComparatorGenerator


特色

Java程式設計經常要對資料進行排序,此時需要寫一個Comparator。但Comparator比較難寫,尤其是在多欄位排序的時候更加複雜。

你可以方便地使用此工具類生成Comparator。你只需要指定在排序的時候要依據哪些欄位以及升序還是降序,這個工具類會為你生成相應的Comparator。

Gradle

dependencies {
    compile 'xiaofei.library:comparator-generator:1.1'
}

Maven

<dependency>
  <groupId>xiaofei.library</groupId>
  <artifactId>comparator-generator</artifactId>
  <version>1.1</version>
  <type>pom</type>
</dependency>

用法

現在假設要對一個類的許多例項進行排序。排序的時候依據某些欄位或者函式的返回值。

那麼你要做的就是告訴工具類這些欄位和函式,並且指定權重以及升降序。

有兩種方法指指定排序策略:使用註解或者使用API。

使用註解

現在要對Item1生成Comparator。排序的時候首先對price進行升序,如果price相同則對distance進行降序,如果distance也相同則對itemName進行升序。

那麼對Item1的相應欄位加上註解:

class Item1 {
    @Criterion(priority = 3, order = Order.ASCENDING)
    private int price;
    @Criterion(priority = 2, order = Order.DESCENDING)
    private int distance;
    @Criterion(priority = 1) // order預設是升序
    private String itemName;
}

使用的時候只需要這樣寫:

Comparator<Item1> comparator = new ComparatorGenerator<Item1>(Item1.class).generate();
Arrays.sort(items1, comparator);

再看一個例子。對Item3排序,先按總價升序,再按itemName升序。總價是由函式給出的,我們依然可以對函式加上註解。

注意:函式必須是無參成員函式!

class Item3 {

    private int price;
    private int number;

    @Criterion(priority = 1) // 預設升序
    private String itemName;

    @Criterion(priority = 2, order = Order.ASCENDING)
    int getTotalPrice() {
        return price * number;
    }

}

使用的時候寫如下程式碼:

Comparator<Item3> comparator = new ComparatorGenerator<Item3>(Item3.class).generate();
Arrays.sort(items3, comparator);

使用API

某些時候要對一個類寫出不同Comparator,比如對訂單排序的時候會有很多種:距離優先、評價優先、價格優先。

那麼這時候就不能使用註解,因為通過註解只能生成唯一的Comparator。

這時候使用api直接指定。

以下有一個類Item2。

class Item2 {

    private int price;

    private int distance;

    private String itemName;
}

首先對price升序,然後對distance降序,然後對itemName升序。

Comparator<Item2> comparator2 =
    new ComparatorGenerator<Item2>(Item2.class)
        .addCriterion(3, "price", Order.ASCENDING)
        .addCriterion(2, "distance", Order.DESCENDING)
        .addCriterion(1, "itemName") // 預設升序
        .generate();
Arrays.sort(items2, comparator2);

再看一個例子。

class Item4 {

    private int price;
    private int number;
    private int distance;

    int getTotalPrice() {
        return price * number;
    }
}

對Item4排序,首先按總價升序,然後按距離降序。

Comparator<Item4> comparator4 =
    new ComparatorGenerator<Item4>(Item4.class)
        .addCriterion(3, "getTotalPrice", Order.ASCENDING)
        .addCriterion(2, "distance", Order.DESCENDING)
        .generate();
Arrays.sort(items4, comparator4);



相關文章