Java 比較器實戰

1 需求

一個項目,展現監控數據列表,數據來源於接口,不須要分頁,目前可時長排序:前端

客戶但願可先對【狀態】分組,而後再對【時長】排序。後端

2 分析

考慮如下方案:bash

1.編寫 js 腳本,在前端作分組排序。 2.利用 Java 比較器,在後端作分組排序,前端直接渲染便可。ide

比較後發現使用 Java 比較器實現,更方便些。單元測試

3 Java 比較器

Java 中有兩種比較器的實現方式:Comparable(內部比較器) 與 Comparator(外部比較器)。測試

3.1 Comparable 接口

代碼模板:ui

public class Entity implements Comparable<Entity> {

    @Override
    public int compareTo(Entity o) {
        return 0;
    }
}
複製代碼

Comparable 接口支持泛型參數,因此一個須要比較實體類只須要按照上面的代碼模板實現 Comparable 接口,便可對傳入的另外一個同類型的實體類進行比較啦。this

由於比較方法是定義在實體類中,因此把它叫作內部比較器。spa

3.2 Comparator 接口

代碼模板:code

public class EntityComparator implements Comparator<Entity> {
    @Override
    public int compare(Entity o1, Entity o2) {
        return 0;
    }
}
複製代碼

Comparator 接口一樣也支持泛型參數。不一樣的是它是一個比較器類,因此叫它外部比較器。比較器類使用更靈活,咱們能夠定義多個比較器類用於不一樣的排序場景。

4 實戰

由於業務場景須要先對【狀態】分組排序後,而後再對【時長】排序,而【時長】的排序又可分爲正序與逆序兩種,因此咱們採用 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哈哈~

相關文章
相關標籤/搜索