一個項目,展現監控數據列表,數據來源於接口,不須要分頁,目前可時長排序:前端
客戶但願可先對【狀態】分組,而後再對【時長】排序。後端
考慮如下方案:bash
1.編寫 js 腳本,在前端作分組排序。 2.利用 Java 比較器,在後端作分組排序,前端直接渲染便可。ide
比較後發現使用 Java 比較器實現,更方便些。單元測試
Java 中有兩種比較器的實現方式:Comparable(內部比較器) 與 Comparator(外部比較器)。測試
代碼模板:ui
public class Entity implements Comparable<Entity> {
@Override
public int compareTo(Entity o) {
return 0;
}
}
複製代碼
Comparable 接口支持泛型參數,因此一個須要比較實體類只須要按照上面的代碼模板實現 Comparable 接口,便可對傳入的另外一個同類型的實體類進行比較啦。this
由於比較方法是定義在實體類中,因此把它叫作內部比較器。spa
代碼模板:code
public class EntityComparator implements Comparator<Entity> {
@Override
public int compare(Entity o1, Entity o2) {
return 0;
}
}
複製代碼
Comparator 接口一樣也支持泛型參數。不一樣的是它是一個比較器類,因此叫它外部比較器。比較器類使用更靈活,咱們能夠定義多個比較器類用於不一樣的排序場景。
由於業務場景須要先對【狀態】分組排序後,而後再對【時長】排序,而【時長】的排序又可分爲正序與逆序兩種,因此咱們採用 Java 外部比較器來實現該業務邏輯。
待比較的實體類:
public class Record {
//狀態
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:先對【狀態】排序,而後再對【時長】按正序排序
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:先對【狀態】排序,而後再對【時長】按逆序(倒序)排序
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哈哈~