餓了麼開源專案:Java Comparator生成器
版權所有。所有權利保留。
歡迎轉載,轉載時請註明出處:
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);
相關文章
- 餓了麼開源專案:便捷高效的Android資料持久化儲存框架Android持久化框架
- Vue仿餓了麼app專案總結VueAPP
- Vue2.x開發餓了麼專案(header部分)VueHeader
- 慕課網 餓了麼 vue2.0 專案Vue
- 餓了麼開源專案Hermes:新穎巧妙易用的Android程式間通訊IPC框架Android框架
- 假如開源專案創始人去世了,專案怎麼辦?
- 餓了麼bxet
- Vue2.x實戰餓了麼專案筆記(一)Vue筆記
- 餓了麼手機版-VUE2,專案實戰程式碼Vue
- 餓了麼美團開放平臺接入
- ui餓了麼框架UI框架
- Github上最熱門的Java專案終於開源了!GithubJava
- 餓了麼UETool原理初探
- 學習開源 java 專案 gunsJava
- 我寫了一個開源專案AlphabetPyAlphabet
- 我最近寫了個開源專案Datura
- 我為什麼把失敗的創業專案開源了創業
- 長沙Java培訓:Java開源專案分享Java
- 餓了麼全自動API閘道器Stargate cluster | 掘金 x 餓了麼技術沙龍API
- 掘金 x 餓了麼技術沙龍 | 架構實踐專場架構
- 設計模式Java實現開源專案設計模式Java
- 泰拉瑞亞遊戲Java開源專案TerraLegion遊戲Java
- Java開源專案Hibernate快速入門Java
- 那些年的開源專案,你跑起來了嗎?
- 關鍵點檢測專案程式碼開源了!
- 一個令人驚豔的ChatGPT專案,開源了!ChatGPT
- 怎麼寫開源專案的README
- Java開源專案管理工具大全(轉)Java專案管理
- IOS開源專案iOS
- 開源專案-WaterMark
- 淘寶開源專案
- 開源專案:MMPopupViewView
- 開源好專案
- 餓了麼快應用初體驗
- 做Java開發7年,今年9個月時間圓夢餓了麼P7Java
- android開源專案【專案篇】Android
- 開源專案-跨專案及作業系統的通用程式碼生成器,解放您的雙手作業系統
- 開源專案年度盛會 OpenHarmony技術日來了