Java中比較器Comparator和Comparable的區(qū)別
一、背景
我們?cè)谑褂?Collections.sort()
對(duì)鏈表進(jìn)行排序(或者使用 Arrays.sort()
對(duì)數(shù)組進(jìn)行排序)時(shí),常常需要根據(jù)不同情況自定義排序規(guī)則。
比如:當(dāng)我們存儲(chǔ)學(xué)生對(duì)象時(shí),我們需要按照學(xué)生年齡進(jìn)行排序,這時(shí)我們就可以通過比較器 Comparator 或者 Comparable 對(duì)排序順序進(jìn)行控制。
本文將結(jié)合示例對(duì) Comparator 和 Comparable 兩種比較器的使用進(jìn)行介紹
二、Comparable
Comparable 是一個(gè)接口,其本質(zhì)上是一個(gè)內(nèi)比較器(在類內(nèi)部)。
需要定義排序/比較規(guī)則的類實(shí)現(xiàn) Comparable 接口,并且重寫 compareTo(Object o)
方法,從而自定義比較規(guī)則。
public interface Comparable<T>
Comparable 代碼示例 :
下面的代碼為 Student
類重寫了 compareTo
方法,實(shí)現(xiàn)了 Student 對(duì)象按照 age 大小進(jìn)行比較
public class Student implements Comparable<Object> { String name; int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "{" + this.getName() + "," + this.getAge() + "}"; } // 通過重寫 compareTo 方法,實(shí)現(xiàn)比較器 @Override public int compareTo(Object o) { Student student = (Student) o; return this.age - student.getAge(); } public static void main(String[] args) { List<Student> list = new ArrayList<>(); list.add(new Student("wanqing", 21)); list.add(new Student("xinyu", 23)); list.add(new Student("huahua", 1)); Collections.sort(list); System.out.println(list); } }
可以觀察到輸出結(jié)果按照 age 升序進(jìn)行了排序 ——
三、Comparator
Comparator
是一個(gè)外比較器,其使用場(chǎng)景為當(dāng)一個(gè)類未實(shí)現(xiàn) Comparable 方法,或者實(shí)現(xiàn)的 Comparable 方法的比較規(guī)則不是我們現(xiàn)在想用的(比如我們想按照降序的方式排序),我們就可以通過為 sort()
方法傳入 Comparator
的形式,自定義排序規(guī)則。
其使用方式如下:
Collections.sort(List<T> list, Comparator<? super T> c); Arrays.sort(T[] a, Comparator<? super T> c);
Comparator
重寫 compare
方法,方法內(nèi)部重寫比較規(guī)則
Comparator 代碼示例
下面代碼通過傳入 Comparator比較器 的方式,實(shí)現(xiàn)了對(duì) list 按照學(xué)生年齡降序排序
public static void main(String[] args) { List<Student> list = new ArrayList<>(); list.add(new Student("wanqing", 21)); list.add(new Student("xinyu", 23)); list.add(new Student("huahua", 1)); // 實(shí)現(xiàn)對(duì) list 按照學(xué)生年齡降序排序 Collections.sort(list, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { // 降序排序 return o2.getAge() - o1.getAge(); } }); System.out.println(list); }
可以觀察到輸出結(jié)果按照 age 進(jìn)行了降序排序 ——
到此這篇關(guān)于Java中比較器Comparator和Comparable的區(qū)別的文章就介紹到這了,更多相關(guān)Java的Comparator和Comparable內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中將多個(gè)PDF文件合并為一個(gè)PDF的方法步驟
這篇文章主要給大家介紹了關(guān)于Java中將多個(gè)PDF文件合并為一個(gè)PDF的方法步驟, Java PDF合并是指將多個(gè)PDF文件合并成一個(gè)PDF文件的過程,需要的朋友可以參考下2023-09-09MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectO
本文主要介紹了MyBatis-Plus 之selectMaps、selectObjs、selectCount、selectOne的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java開發(fā)學(xué)習(xí)之Bean的生命周期詳解
從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個(gè)過程就是一個(gè)生命周期。本文將通過示例為大家詳細(xì)講講Bean的生命周期,感興趣的可以學(xué)習(xí)一下2022-06-06Java中JSON字符串與java對(duì)象的互換實(shí)例詳解
這篇文章主要介紹了在java中,JSON字符串與java對(duì)象的相互轉(zhuǎn)換實(shí)例詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08使用mybatis log plugin插件展示出數(shù)據(jù)庫查詢語句方式
本文介紹了如何安裝和配置MyBatis日志插件,包括集成log4j、配置log4j.xml文件和在application.properties中添加數(shù)據(jù)庫打印配置,通過這些步驟,可以在調(diào)試時(shí)查看預(yù)編譯的數(shù)據(jù)庫語句和實(shí)際查詢語句2024-11-11Java核心編程之文件隨機(jī)讀寫類RandomAccessFile詳解
這篇文章主要為大家詳細(xì)介紹了Java核心編程之文件隨機(jī)讀寫類RandomAccessFile,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08