欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中TreeSet、HashSet、Collection重寫比較器的實現(xiàn)

 更新時間:2023年08月10日 10:42:59   作者:高垚淼  
比較器是一種可以對集合或數(shù)組中的元素按照自定義的方式進行排序的對象,本文主要介紹了Java中TreeSet、HashSet、Collection重寫比較器的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、什么是比較器?

比較器是一種可以對集合或數(shù)組中的元素按照自定義的方式進行排序的對象,它是實現(xiàn)了Comparator接口的類的實例,可以決定元素在集合或映射中如何被排序和存儲。

比較器有兩種基本類型:自然排序和定制排序。自然排序是指讓要排序的類實現(xiàn)Comparable接口,并重寫compareTo方法,來定義元素的默認排序方式。定制排序是指創(chuàng)建一個實現(xiàn)了Comparator接口的類,并重寫compare方法,來定義元素的特定排序方式。定制排序可以覆蓋自然排序,也可以在自然排序不適用的情況下使用。

二、TreeSet為什么重寫比較器?

TreeSet是一個有序的集合,它可以按照自然排序或者定制排序來排列元素。自然排序是指讓要排序的類實現(xiàn)Comparable接口,并重寫compareTo方法,來定義元素的默認排序方式。定制排序是指創(chuàng)建一個實現(xiàn)了Comparator接口的類,并重寫compare方法,來定義元素的特定排序方式。

TreeSet實現(xiàn)了Set接口,可以去重內(nèi)容相同的元素。比如存入Integer類型的兩個數(shù)據(jù),6和6,遍歷輸出,只會輸出一個6。但是對于自定義類,添加進TreeSet排序,會報錯,因為比較器無法比較一個類。因此我們重寫比較器,按照類中的指定屬性進行排序

代碼展示:

直接使用這個模板也是可以的,根據(jù)什么排序,就使用什么來做減法。等于0時會去重,正數(shù)會從小到大排序,負數(shù)會從大到小排序。

// 創(chuàng)建一個按照年齡升序排列的TreeSet
TreeSet<Person> ts = new TreeSet<>(new Comparator<Person>() {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
});

三、HashSet為什么重寫比較器?

HashSet是一個無序的集合,它不保證元素的排列順序,并且不允許重復(fù)元素。HashSet是基于哈希表實現(xiàn)的,它通過調(diào)用元素的hashCode和equals方法來判斷元素是否相等和決定元素在哈希表中的位置。

當我們添加進HashSet中相同屬性的兩個類,想去重時,可以選擇重寫hashcode方法和equal方法。(HashSet的比較器底層實現(xiàn)通過hashcode和equal,兩個返回值都為true時,才會去重)

代碼展示:

// 定義一個Person類,并重寫hashCode和equals方法
class Person {
    private String name;
    private int age;

    // 省略構(gòu)造方法和get/set方法

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }
}

// 創(chuàng)建一個HashSet對象,并添加Person對象
HashSet<Person> hs = new HashSet<>();
hs.add(new Person("張三", 20));
hs.add(new Person("李四", 21));
hs.add(new Person("張三", 20)); // 這個對象不會被添加,因為和第一個對象相等

四、Collection為什么重寫比較器?

Collection是一個接口,它是Java集合框架的根接口,它定義了一些通用的操作方法,如添加、刪除、遍歷、排序等。Collection接口有很多實現(xiàn)類,如ArrayList、LinkedList、HashSet、TreeSet等。Collection接口本身并不需要重寫比較器,但是它提供了一個sort方法,可以對實現(xiàn)了List接口的集合進行排序。該方法有兩個重載形式,一個是使用自然排序,另一個是使用定制排序。

當我們想對ArryList集合進行排序時(ArryList本身無法排序,沒有比較器),可以通過重寫比較器來進行排序。

// 創(chuàng)建一個ArrayList對象,并添加一些字符串
ArrayList<String> al = new ArrayList<>();
al.add("apple");
al.add("banana");
al.add("orange");
al.add("pear");

// 使用自然排序?qū)rrayList進行排序
Collections.sort(al);

// 使用定制排序?qū)rrayList進行排序,按照字符串長度升序排列
Collections.sort(al, (s1, s2) -> s1.length() - s2.length());

到此這篇關(guān)于Java中TreeSet、HashSet、Collection重寫比較器的實現(xiàn)的文章就介紹到這了,更多相關(guān)Java 重寫比較器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 使用Spring?Batch實現(xiàn)大數(shù)據(jù)處理的操作方法

    使用Spring?Batch實現(xiàn)大數(shù)據(jù)處理的操作方法

    通過使用Spring?Batch,我們可以高效地處理大規(guī)模數(shù)據(jù),本文介紹了如何配置和實現(xiàn)一個基本的Spring?Batch作業(yè),包括讀取數(shù)據(jù)、處理數(shù)據(jù)和寫入數(shù)據(jù)的全過程,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • Java?自定義注解在登錄驗證的應(yīng)用示例

    Java?自定義注解在登錄驗證的應(yīng)用示例

    本文主要介紹了Java?自定義注解在登錄驗證的應(yīng)用示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • SpringBoot集成內(nèi)存數(shù)據(jù)庫H2的實踐

    SpringBoot集成內(nèi)存數(shù)據(jù)庫H2的實踐

    h2是內(nèi)存數(shù)據(jù)庫,查詢高效,可以在開發(fā)初期使用它。本文主要介紹了SpringBoot集成內(nèi)存數(shù)據(jù)庫H2的實踐,具有一定的參考價值,感興趣的可以了解一下
    2021-09-09
  • 使用Spring AOP實現(xiàn)MySQL數(shù)據(jù)庫讀寫分離案例分析(附demo)

    使用Spring AOP實現(xiàn)MySQL數(shù)據(jù)庫讀寫分離案例分析(附demo)

    分布式環(huán)境下數(shù)據(jù)庫的讀寫分離策略是解決數(shù)據(jù)庫讀寫性能瓶頸的一個關(guān)鍵解決方案,這篇文章主要介紹了使用Spring AOP實現(xiàn)MySQL數(shù)據(jù)庫讀寫分離案例分析(附demo),有興趣的可以了解一下。
    2017-01-01
  • JAVA返回PDF文件流并進行下載的實現(xiàn)方法

    JAVA返回PDF文件流并進行下載的實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于JAVA返回PDF文件流并進行下載的實現(xiàn)方法,PDF文件流下載是通過HTTP協(xié)議將服務(wù)器上的PDF文件以流的方式發(fā)送給客戶端,供客戶端保存到本地磁盤或直接在瀏覽器中打開,需要的朋友可以參考下
    2024-02-02
  • JAVA異常體系結(jié)構(gòu)詳解

    JAVA異常體系結(jié)構(gòu)詳解

    Java把異常當作對象來處理,并定義一個基類java.lang.Throwable作為所有異常的超類,下面通過本文給大家分享JAVA異常體系結(jié)構(gòu),感興趣的朋友一起看看吧
    2017-11-11
  • Springboot2.0處理自定義異常并返回json

    Springboot2.0處理自定義異常并返回json

    這篇文章主要介紹了Springboot2.0處理自定義異常并返回json,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • MyBatis-Plus攔截器實現(xiàn)數(shù)據(jù)權(quán)限控制的方法

    MyBatis-Plus攔截器實現(xiàn)數(shù)據(jù)權(quán)限控制的方法

    MyBatis-Plus是一款基于MyBatis的增強工具,它提供了一些便捷的功能和增強的查詢能力,數(shù)據(jù)權(quán)限控制是在系統(tǒng)中對用戶訪問數(shù)據(jù)進行限制的一種機制,這篇文章主要給大家介紹了關(guān)于MyBatis-Plus攔截器實現(xiàn)數(shù)據(jù)權(quán)限控制的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Java如何獲取resources下的文件路徑和創(chuàng)建臨時文件

    Java如何獲取resources下的文件路徑和創(chuàng)建臨時文件

    這篇文章主要介紹了Java如何獲取resources下的文件路徑和創(chuàng)建臨時文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java利用POI讀取、寫入Excel的方法指南

    Java利用POI讀取、寫入Excel的方法指南

    這篇文章主要給大家介紹了關(guān)于Java利用POI讀取、寫入Excel的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03

最新評論