Java中的排序Comparator類用法詳解
一、 做什么
Comparator 類常作為 sorted() 方法的參數(shù)傳遞給 sorted 方法,用來解決給集合排序,自定義排序規(guī)則的問題 。
那從這個(gè)角度看,這個(gè)類肯定很常用了,因?yàn)槲抑来蠹叶疾幌矚g自己寫排序方法,而且自己寫的肯定還有性能優(yōu)化問題,我們直接用 jdk 幫我們封裝好的,就即簡潔,又易于閱讀 。
ps: 本文中提供的代碼,為了提高可讀性都沒用 lamdam 和 函數(shù)式編程 簡化書寫,大家平時(shí)用的時(shí)候,自己使用 IDEA 快捷鍵轉(zhuǎn)化一下
二、使用
1. 對(duì) Array 數(shù)組類型進(jìn)行排序
下面是 Arrays 類暴露給我們的排序方法 —— sorted
Stream<T> sorted(Comparator<? super T> comparator);
Comparator 接口暴露給我們以下方法給我們實(shí)現(xiàn):
int compare(T o1, T o2);
(1)情況一 : 直接 new Comparator 對(duì)象,然后實(shí)現(xiàn)其 compare 方法進(jìn)行排序
這種情況可以在 compare 內(nèi)部定義好排序規(guī)則,看起來非常直觀,通過在 compare 中寫好邏輯代碼,可以實(shí)現(xiàn)多種排序規(guī)則 。
這種方式只能用于包裝類型的數(shù)組,如果數(shù)組是基本數(shù)據(jù)類型,必須轉(zhuǎn)成包裝類才能使用實(shí)現(xiàn) compare 方法進(jìn)行定義排序
public static void test(){
// 對(duì)包裝類型的數(shù)組進(jìn)行排序
Integer[] a = {1, 2, 3, 0};
// 直接對(duì) a 排序
Arrays.sort(a, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
// 不對(duì) a 排序,而是將 a 排序的結(jié)果給 a2
Integer[] a2 = Arrays.stream(a).sorted(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
}).toArray(new IntFunction<Integer[]>() {
@Override
public Integer[] apply(int value) {
return new Integer[value];
}
});
// 對(duì)基本數(shù)據(jù)類型的數(shù)組進(jìn)行排序 —— 不允許自定義排序規(guī)則
int[] b = {1, 3, 2, 4};
Arrays.sort(b);
int[] b1 = Arrays.stream(b).sorted().toArray();
}(2)情況二: 使用 Comparator 提供的靜態(tài)方法,鏈?zhǔn)降奶砑优判蛞?guī)則
這種方式也可以隨意定制排序規(guī)則,而且相對(duì)來說,代碼的可讀性更高,如下實(shí)例:
Integer[] a1 = Arrays.stream(a).sorted(Comparator.comparing(new Function<Integer, Integer>() {
@Override
public Integer apply(Integer integer) {
return integer;
}
}).reversed()).toArray(new IntFunction<Integer[]>() {
@Override
public Integer[] apply(int value) {
return new Integer[value];
}
});其提供了如下方法,供我們使用 : 其中 then 那一堆可以幫我們定義二級(jí)排序規(guī)則,也就是說第一級(jí)相等的時(shí)候,按照那個(gè)屬性進(jìn)行排序

2. 對(duì) Collection 集合類型進(jìn)行排序
總體思想和上面的差不多
下面是一個(gè)例子 :
public void test2(){
List<Student> list = new ArrayList<>();
// 對(duì) list 按照 先年齡 后 成績的方式排序
Collections.sort(list, Comparator.comparing(Student :: getAge).thenComparing(Student :: getScore));
// 將 list 按照先成績 再年齡 的方式排序,并將結(jié)果賦值給 list2
List<Student> list2 = list.stream().sorted(Comparator.comparing(Student :: getScore).thenComparing(Student :: getAge)).collect(Collectors.toList());
}
class Student{
int name;
int age;
int score;
public int getName() {
return name;
}
public void setName(int name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}三、總結(jié)
直接創(chuàng)建 Comparator 類實(shí)例, 然后重寫 compare 方法定義排序規(guī)則使用 Comparator 靜態(tài)方法進(jìn)行排序,直接用類名調(diào)用進(jìn)行排序,給方法傳入相應(yīng)的排序指標(biāo)
到此這篇關(guān)于Java中的排序Comparator類用法詳解的文章就介紹到這了,更多相關(guān)Java的Comparator內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Security CsrfFilter過濾器用法實(shí)例
這篇文章主要介紹了Spring Security CsrfFilter過濾器用法實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
使用IDEA深度調(diào)試MyBatis SQL執(zhí)行流程的實(shí)用指南
在軟件開發(fā)的世界中,調(diào)試不僅是解決問題的工具,更是理解系統(tǒng)運(yùn)行機(jī)制的窗口,對(duì)于像MyBatis這樣復(fù)雜的持久層框架,掌握高效的調(diào)試技巧能夠讓我們真正洞察SQL從方法調(diào)用到數(shù)據(jù)庫執(zhí)行的完整生命周期,所以本文給大家介紹了使用IDEA深度調(diào)試MyBatis SQL執(zhí)行流程的實(shí)用指南2025-10-10
Jeecg-Boot異常處理'jeecg-boot.QRTZ_LOCKS'?doesn'
這篇文章主要介紹了Jeecg-Boot異常處理'jeecg-boot.QRTZ_LOCKS'?doesn't?exist問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
SpringBoot Redisson 集成的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot Redisson 集成的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
Spring MVC請(qǐng)求參數(shù)的深入解析
這篇文章主要給大家介紹了關(guān)于Spring MVC請(qǐng)求參數(shù)解析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
SpringBoot集成antlr實(shí)現(xiàn)詞法和語法分析
Antlr4 是一款強(qiáng)大的語法生成器工具,可用于讀取、處理、執(zhí)行和翻譯結(jié)構(gòu)化的文本或二進(jìn)制文件,基本上是當(dāng)前 Java 語言中使用最為廣泛的語法生成器工具,本文給大家介紹了SpringBoot集成antlr實(shí)現(xiàn)詞法和語法分析,需要的朋友可以參考下2024-06-06
Spring Boot實(shí)現(xiàn)圖片上傳/加水印一把梭操作實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Spring Boot實(shí)現(xiàn)圖片上傳/加水印一把梭操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
Spring Security 中如何讓上級(jí)擁有下級(jí)的所有權(quán)限(案例分析)
這篇文章主要介紹了Spring Security 中如何讓上級(jí)擁有下級(jí)的所有權(quán)限,本文通過案例分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
自定義注解和springAOP捕獲Service層異常,并處理自定義異常操作
這篇文章主要介紹了自定義注解和springAOP捕獲Service層異常,并處理自定義異常操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Java實(shí)現(xiàn)統(tǒng)一支付入口集成六種支付方式
本文介紹了Java實(shí)現(xiàn)統(tǒng)一支付入口集成六種支付方式,包括PC端、H5端、微信小程序端和自研會(huì)員卡支付的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-11-11

