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

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

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

一、什么是比較器?

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

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

二、TreeSet為什么重寫(xiě)比較器?

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

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

代碼展示:

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

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

三、HashSet為什么重寫(xiě)比較器?

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

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

代碼展示:

// 定義一個(gè)Person類,并重寫(xiě)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)建一個(gè)HashSet對(duì)象,并添加Person對(duì)象
HashSet<Person> hs = new HashSet<>();
hs.add(new Person("張三", 20));
hs.add(new Person("李四", 21));
hs.add(new Person("張三", 20)); // 這個(gè)對(duì)象不會(huì)被添加,因?yàn)楹偷谝粋€(gè)對(duì)象相等

四、Collection為什么重寫(xiě)比較器?

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

當(dāng)我們想對(duì)ArryList集合進(jìn)行排序時(shí)(ArryList本身無(wú)法排序,沒(méi)有比較器),可以通過(guò)重寫(xiě)比較器來(lái)進(jìn)行排序。

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

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Java利用POI讀取、寫(xiě)入Excel的方法指南

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

最新評(píng)論