Java比較器實現(xiàn)方法項目案例
本文實例講述了Java比較器實現(xiàn)方法。分享給大家供大家參考,具體如下:
1 需求
一個項目,展示監(jiān)控數(shù)據(jù)列表,數(shù)據(jù)來源于接口,不需要分頁,目前可時長排序:

客戶希望可先對【狀態(tài)】分組,然后再對【時長】排序。
2 分析
考慮以下方案:
①.編寫 js 腳本,在前端做分組排序。
②.利用 Java 比較器,在后端做分組排序,前端直接渲染即可。
比較后發(fā)現(xiàn)使用 Java 比較器實現(xiàn),更方便些。
3 Java 比較器
Java 中有兩種比較器的實現(xiàn)方式:Comparable(內(nèi)部比較器) 與 Comparator(外部比較器)。
3.1 Comparable 接口
代碼模板:
public class Entity implements Comparable<Entity> {
@Override
public int compareTo(Entity o) {
return 0;
}
}
Comparable 接口支持泛型參數(shù),所以一個需要比較實體類只需要按照上面的代碼模板實現(xiàn) Comparable 接口,即可對傳入的另一個同類型的實體類進行比較啦。
因為比較方法是定義在實體類中,所以把它叫做內(nèi)部比較器。
3.2 Comparator 接口
代碼模板:
public class EntityComparator implements Comparator<Entity> {
@Override
public int compare(Entity o1, Entity o2) {
return 0;
}
}
Comparator 接口同樣也支持泛型參數(shù)。不同的是它是一個比較器類,所以叫它外部比較器。比較器類使用更靈活,我們可以定義多個比較器類用于不同的排序場景。
4 實戰(zhàn)
因為業(yè)務場景需要先對【狀態(tài)】分組排序后,然后再對【時長】排序,而【時長】的排序又可分為正序與逆序兩種,所以我們采用 Java 外部比較器來實現(xiàn)該業(yè)務邏輯。
待比較的實體類:
public class Record {
//狀態(tài)
private String state;
//時長
private String time;
public Record(String state, String time) {
this.state = state;
this.time = time;
}
public String getState() {
return state;
}
public String getTime() {
return time;
}
@Override
public String toString() {
return "Record{" +
"state='" + state + '\'' +
", time='" + time + '\'' +
'}';
}
}
比較器 A:先對【狀態(tài)】排序,然后再對【時長】按正序排序
public class RecordComparator implements Comparator<Record> {
@Override
public int compare(Record o1, Record o2) {
final int stateCompare = o1.getState().compareTo(o2.getState());
if (stateCompare == 0) {
return o1.getTime().compareTo(o2.getTime());
}
return stateCompare;
}
}
比較器 B:先對【狀態(tài)】排序,然后再對【時長】按逆序(倒序)排序
public class RecordTimeDescComparator implements Comparator<Record> {
@Override
public int compare(Record o1, Record o2) {
final int stateCompare = o1.getState().compareTo(o2.getState());
if (stateCompare == 0) {
return o2.getTime().compareTo(o1.getTime());
}
return stateCompare;
}
}
單元測試:
Record record1 = new Record("通話中", "00:01:08");
Record record2 = new Record("空閑", "00:18:02");
Record record3 = new Record("通話中", "00:04:04");
Record record4 = new Record("空閑", "00:01:57");
List<Record> recordList = new ArrayList<>();
recordList.add(record1);
recordList.add(record2);
recordList.add(record3);
recordList.add(record4);
System.out.println("排序前:" + recordList);
Collections.sort(recordList, new RecordComparator());
System.out.println("排序后【時間正序】:" + recordList);
recordList = new ArrayList<>();
recordList.add(record1);
recordList.add(record2);
recordList.add(record3);
recordList.add(record4);
System.out.println("排序前:" + recordList);
Collections.sort(recordList, new RecordTimeDescComparator());
System.out.println("排序后【時間倒序】:" + recordList);
輸出結果:
排序前:[Record{state='通話中', time='00:01:08'}, Record{state='空閑', time='00:18:02'}, Record{state='通話中', time='00:04:04'}, Record{state='空閑', time='00:01:57'}]
排序后【時間正序】:[Record{state='空閑', time='00:01:57'}, Record{state='空閑', time='00:18:02'}, Record{state='通話中', time='00:01:08'}, Record{state='通話中', time='00:04:04'}]
排序前:[Record{state='通話中', time='00:01:08'}, Record{state='空閑', time='00:18:02'}, Record{state='通話中', time='00:04:04'}, Record{state='空閑', time='00:01:57'}]
排序后【時間倒序】:[Record{state='空閑', time='00:18:02'}, Record{state='空閑', time='00:01:57'}, Record{state='通話中', time='00:04:04'}, Record{state='通話中', time='00:01:08'}]
通過 Java 比較器就可以把看似復雜的問題解決啦O(∩_∩)O哈哈~
PS:這里再為大家推薦一款關于排序的演示工具供大家參考:
在線動畫演示插入/選擇/冒泡/歸并/希爾/快速排序算法過程工具:
http://tools.jb51.net/aideddesign/paixu_ys
更多關于java算法相關內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。
相關文章
詳解Java中Array和ArrayList的比較和轉(zhuǎn)換
在 Java 編程中,arrays 和 arraylists 都是基本的數(shù)據(jù)結構,用來存放數(shù)據(jù)集合,雖然兩者的用途一樣,但是它們的特點極大地影響應用的性能和靈活性,本文探討 arrays 和 arraylists 的重要特性,它們各自的強項和弱點,,需要的朋友可以參考下2023-08-08
Spring條件注解@ConditionnalOnClass的原理分析
這篇文章主要介紹了Spring條件注解@ConditionnalOnClass的原理分析,所謂@ConditionalOnClass注解,翻譯過來就是基于class的條件,它為所標注的類或方法添加限制條件,當該條件的值為true時,其所標注的類或方法才能生效,需要的朋友可以參考下2023-12-12
Springboot如何使用OSHI獲取和操作系統(tǒng)和硬件信息
這篇文章主要介紹了Springboot如何使用OSHI獲取和操作系統(tǒng)和硬件信息問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10

