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

Java去重排序之Comparable與Comparator的使用及說明

 更新時間:2023年04月06日 16:56:47   作者:debug4flaw  
這篇文章主要介紹了Java去重排序之Comparable與Comparator的使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

一、排序與去重

日常工作中,總會有一些場景需要對結果集進行一些過濾。比如,與第三方交互后獲取的結果集,需要再次排序去重,此時就會根據(jù)某個字段來去重,又或者某個字段來排序。

在Java中,去重的話,我們很容易就想到了Set的特性(無序無重),并且TreeSet(有序無重)還可以指定去重的規(guī)則(去重后一般是升序的結果集)。

排序的話,我們很容易想到各種排序算法,但Java中已經(jīng)提供了排序的功能,如集合中sort()方法,并且還可以指定排序的字段和升降序。

在此多說一句,Set的特性(無序無重):

  • 無序:無序性不是隨機性,因為放入set中的元素,會根據(jù)元素的hash值來決定所放入的位置
  • 無重:添加元素時 ,會按照元素的equals()進行判斷,false認為兩個元素不等時,才會添加

二、Comparable與Comparator的使用

public class CompareTest {

    public static void main(String[] args) {
        // 例如:從第三方返回的結果集
        // 根據(jù)id去重,根據(jù)createTime降序排列
        String result = "["
                + "{ \"id\": 1, \"createTime\": \"2022-12-21 13:23:59\"}"
                + "{ \"id\": 2, \"createTime\": \"2022-11-11 12:43:01\"}"
                + "{ \"id\": 1, \"createTime\": \"2022-12-21 11:20:50\"}"
                + "{ \"id\": 3, \"createTime\": \"2023-01-01 14:30:00\"}"
                + "]";
        JSONArray examList = JSONArray.parseArray(result);
        System.out.println("初始數(shù)據(jù)集:" + examList);

        // 去重,利用set特性
        Comparator<JSONObject> comparator = (a, b) -> Integer.compare(a.getIntValue("id"), b.getIntValue("id"));
        Set<JSONObject> set = new TreeSet<>(comparator);
        examList.forEach(jo -> set.add((JSONObject) jo));
        // 此時的結果是,根據(jù)id去重,并且是升序的結果(自然排序)
        System.out.println("去重結果:" + set);

        // 此處為了,方便演示Comparable接口的作用,故把JSON映射成實體類,進行實現(xiàn)接口排序,其實sorted也可以使用Comparator排序
        List<ExamInfo> collect = set.stream()
                .map(jo -> JSONObject.toJavaObject(jo, ExamInfo.class))
                .sorted()
                .collect(Collectors.toList());
        System.out.println("指定排序結果:" + collect);
    }

}
public class ExamInfo implements Comparable<ExamInfo> {

    private int id;
    private String createTime;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return "ExamInfo{" +
                "id=" + id +
                ", createTime='" + createTime + '\'' +
                '}';
    }

    @Override
    public int compareTo(ExamInfo o) {
        // 降序
        return o.getCreateTime().compareTo(this.createTime);
    }
}

在這里插入圖片描述

關于排序升降序問題,Comparable與Comparator中的比較方法的返回值,大于0就交換。

所以參數(shù)順序為a,b時:

  • a>b,即a-b>0,因為順序是 a,b,交換后,b在前,a在后,排序順序升序,即為自然排序;
 // 升序
 Comparator<JSONObject> comparator = (a, b) -> Integer.compare(a.getIntValue("id"), b.getIntValue("id"));
  • b>a,即b-a>0,因為順序是 a,b,交換后,b在前,a在后,排序順序降序
 	@Override
 	public int compareTo(ExamInfo o) {
        // 降序
        return o.getCreateTime().compareTo(this.createTime);
    }

三、區(qū)別

ComparableComparator
所屬包java.langjava.util
是否為函數(shù)式接口
比較的方法int compareTo(T o)int compare(T o1, T o2)
使用場景比較的對象,自己可修改比較的對象,自己不能修改,或者對象實現(xiàn)了Comparable接口,但比較規(guī)則不適用

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java基礎之ArrayList的擴容機制

    Java基礎之ArrayList的擴容機制

    這篇文章主要介紹了Java基礎之ArrayList的擴容機制,文中有非常詳細的代碼示例,對正在學習java基礎的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • Java面試最容易被刷的重難點之鎖的使用策略

    Java面試最容易被刷的重難點之鎖的使用策略

    鎖像synchronized同步塊一樣,是一種線程同步機制,但比Java中的synchronized同步塊更復雜。因為鎖(以及其它更高級的線程同步機制)是由synchronized同步塊的方式實現(xiàn)的,所以我們還不能完全擺脫synchronized關鍵字
    2021-10-10
  • Spark?集群執(zhí)行任務失敗的故障處理方法

    Spark?集群執(zhí)行任務失敗的故障處理方法

    這篇文章主要為大家介紹了Spark?集群執(zhí)行任務失敗的故障處理方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Maven環(huán)境安裝配置和新建項目介紹

    Maven環(huán)境安裝配置和新建項目介紹

    這篇文章介紹了Maven環(huán)境安裝配置和新建項目介紹,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • SpringBoot實現(xiàn)定時發(fā)送郵件的三種方法案例詳解

    SpringBoot實現(xiàn)定時發(fā)送郵件的三種方法案例詳解

    這篇文章主要介紹了SpringBoot三種方法實現(xiàn)定時發(fā)送郵件的案例,Spring框架的定時任務調度功能支持配置和注解兩種方式Spring?Boot在Spring框架的基礎上實現(xiàn)了繼承,并對其中基于注解方式的定時任務實現(xiàn)了非常好的支持,本文給大家詳細講解,需要的朋友可以參考下
    2023-03-03
  • 華為鴻蒙系統(tǒng)應用開發(fā)工具 DevEco Studio的安裝和使用圖文教程

    華為鴻蒙系統(tǒng)應用開發(fā)工具 DevEco Studio的安裝和使用圖文教程

    HUAWEI DevEco Studio 是華為消費者業(yè)務為開發(fā)者提供的集成開發(fā)環(huán)境(IDE),旨在幫助開發(fā)者快捷、方便、高效地使用華為EMUI開放能力。這篇文章主要介紹了華為鴻蒙系統(tǒng)應用開發(fā)工具 DevEco Studio的安裝和使用圖文教程,需要的朋友可以參考下
    2021-04-04
  • JVM完全解讀之GC日志記錄分析

    JVM完全解讀之GC日志記錄分析

    這篇文章主要介紹了JVM完全解讀之GC日志記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-01-01
  • 詳解SpringBoot的三種緩存技術(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)

    詳解SpringBoot的三種緩存技術(Spring Cache、Layering Cache 框架、Alibaba J

    這篇文章主要介紹了SpringBoot的三種緩存技術,幫助大家更好的理解和學習springboot框架,感興趣的朋友可以了解下
    2020-10-10
  • Java虛擬機類加載器之雙親委派機制模型案例

    Java虛擬機類加載器之雙親委派機制模型案例

    這篇文章主要介紹了Java虛擬機類加載器之雙親委派機制模型案例,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java使用正則表達式判斷獨立字符的存在(代碼示例)

    Java使用正則表達式判斷獨立字符的存在(代碼示例)

    通過使用正則表達式,我們可以更加靈活地判斷字符串中是否包含特定的字符,并且可以控制匹配的條件,如獨立的字符,這為我們處理字符串提供了更多的選擇和功能,這篇文章主要介紹了Java使用正則表達式判斷獨立字符的存在,需要的朋友可以參考下
    2023-10-10

最新評論

盈江县| 仁化县| 江西省| 乌兰浩特市| 库车县| 南岸区| 永昌县| 苗栗县| 务川| 五峰| 葵青区| 敦煌市| 永胜县| 旬邑县| 三穗县| 云浮市| 天门市| 枣阳市| 屏南县| 阿拉尔市| 九龙城区| 师宗县| 马龙县| 丰城市| 万荣县| 大关县| 北票市| 大渡口区| 和龙市| 鸡西市| 呼图壁县| 鲁山县| 星座| 沙洋县| 安多县| 临沂市| 铁岭县| 莆田市| 广元市| 广西| 梅河口市|