Java中TreeSet、HashSet、Collection重寫(xiě)比較器的實(shí)現(xiàn)
一、什么是比較器?
比較器是一種可以對(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ù)處理的操作方法
通過(guò)使用Spring?Batch,我們可以高效地處理大規(guī)模數(shù)據(jù),本文介紹了如何配置和實(shí)現(xiàn)一個(gè)基本的Spring?Batch作業(yè),包括讀取數(shù)據(jù)、處理數(shù)據(jù)和寫(xiě)入數(shù)據(jù)的全過(guò)程,感興趣的朋友跟隨小編一起看看吧2024-07-07Java?自定義注解在登錄驗(yàn)證的應(yīng)用示例
本文主要介紹了Java?自定義注解在登錄驗(yàn)證的應(yīng)用示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12SpringBoot集成內(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)
分布式環(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-01JAVA返回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-02MyBatis-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-01Java如何獲取resources下的文件路徑和創(chuàng)建臨時(shí)文件
這篇文章主要介紹了Java如何獲取resources下的文件路徑和創(chuàng)建臨時(shí)文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12