餓了麼開源專案:Java Comparator生成器
版權所有。所有權利保留。
歡迎轉載,轉載時請註明出處:
公司Android專案裡經常需要對元素進行排序,而排序都是多欄位的,相應的Comparator比較難寫。於是我就寫了這麼一個工具類,使用者只需要指定排序規則,便可以自動生成相應的Comparator。
專案地址:
特色
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);