最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java比較器實現(xiàn)方法項目案例

 更新時間:2019年03月05日 14:23:29   作者:deniro_li  
這篇文章主要介紹了Java比較器實現(xiàn)方法,結(jié)合具體項目案例形式分析了Java比較器相關(guā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è)務(wù)場景需要先對【狀態(tài)】分組排序后,然后再對【時長】排序,而【時長】的排序又可分為正序與逆序兩種,所以我們采用 Java 外部比較器來實現(xiàn)該業(yè)務(wù)邏輯。

待比較的實體類:

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);

輸出結(jié)果:

排序前:[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:這里再為大家推薦一款關(guān)于排序的演示工具供大家參考:

在線動畫演示插入/選擇/冒泡/歸并/希爾/快速排序算法過程工具:
http://tools.jb51.net/aideddesign/paixu_ys

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計有所幫助。

相關(guān)文章

  • Mybatis中特殊SQL的執(zhí)行的實現(xiàn)示例

    Mybatis中特殊SQL的執(zhí)行的實現(xiàn)示例

    本文主要介紹了Mybatis中特殊SQL的執(zhí)行的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • Maven中Could not find artifact XXXX的錯誤解決

    Maven中Could not find artifact XXXX的錯誤解決

    本文主要介紹了Maven中Could not find artifact XXXX的錯誤解決,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 淺談java IO流——四大抽象類

    淺談java IO流——四大抽象類

    這篇文章主要介紹了java IO流——四大抽象類,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Spring Security常用過濾器實例解析

    Spring Security常用過濾器實例解析

    這篇文章主要介紹了Spring Security常用過濾器實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • springboot自定義日志注解的實現(xiàn)

    springboot自定義日志注解的實現(xiàn)

    本文主要介紹了springboot自定義日志注解的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • SpringBoot啟動失敗的原因及其解決方法

    SpringBoot啟動失敗的原因及其解決方法

    對于springboot的啟動失敗,相信大家都有經(jīng)歷,但是為什么會啟動失敗,以及怎么解決都只能通過日志進行查看,在這里,我會將常見的springboot啟動失敗的報錯一一展示,需要的朋友可以參考下
    2024-06-06
  • 教你代碼中獲取當前?JAR?包的存放位置

    教你代碼中獲取當前?JAR?包的存放位置

    這篇文章主要介紹了如何獲取當前JAR包的存放位置,要獲取當前運行的 JAR 包所存放的位置,可以使用 ProtectionDomain 和 CodeSource 類,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • Java編程IP地址和數(shù)字相互轉(zhuǎn)換代碼示例

    Java編程IP地址和數(shù)字相互轉(zhuǎn)換代碼示例

    這篇文章主要介紹了Java編程IP地址和數(shù)字相互轉(zhuǎn)換代碼示例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-11-11
  • 為什么Java開發(fā)需要配置環(huán)境變量

    為什么Java開發(fā)需要配置環(huán)境變量

    這篇文章主要介紹了為什么Java開發(fā)需要配置環(huán)境變量,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下
    2020-08-08
  • spring boot與spring mvc的區(qū)別及功能介紹

    spring boot與spring mvc的區(qū)別及功能介紹

    這篇文章主要介紹了spring boot與spring mvc的區(qū)別是什么以及spring boot和spring mvc功能介紹,感興趣的朋友一起看看吧
    2018-02-02

最新評論

九龙坡区| 龙州县| 明星| 饶平县| 乌兰察布市| 丽江市| 石台县| 三明市| 灌南县| 宜章县| 新源县| 女性| 建始县| 甘南县| 新余市| 肃北| 忻城县| 内丘县| 韶关市| 宿迁市| 郑州市| 阿拉善左旗| 鹤庆县| 双流县| 上饶市| 顺义区| 定陶县| 依兰县| 龙门县| 桦川县| 白朗县| 阳曲县| 嘉善县| 原阳县| 辽宁省| 开封市| 南阳市| 临漳县| 喀喇沁旗| 余干县| 怀化市|