Java中的排序Comparator類用法詳解
一、 做什么
Comparator 類常作為 sorted() 方法的參數(shù)傳遞給 sorted 方法,用來(lái)解決給集合排序,自定義排序規(guī)則的問(wèn)題 。
那從這個(gè)角度看,這個(gè)類肯定很常用了,因?yàn)槲抑来蠹叶疾幌矚g自己寫排序方法,而且自己寫的肯定還有性能優(yōu)化問(wèn)題,我們直接用 jdk 幫我們封裝好的,就即簡(jiǎn)潔,又易于閱讀 。
ps: 本文中提供的代碼,為了提高可讀性都沒(méi)用 lamdam 和 函數(shù)式編程 簡(jiǎn)化書寫,大家平時(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ī)則,看起來(lá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ì)來(lái)說(shuō),代碼的可讀性更高,如下實(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ī)則,也就是說(shuō)第一級(jí)相等的時(shí)候,按照那個(gè)屬性進(jìn)行排序
2. 對(duì) Collection 集合類型進(jìn)行排序
總體思想和上面的差不多
下面是一個(gè)例子 :
public void test2(){ List<Student> list = new ArrayList<>(); // 對(duì) list 按照 先年齡 后 成績(jī)的方式排序 Collections.sort(list, Comparator.comparing(Student :: getAge).thenComparing(Student :: getScore)); // 將 list 按照先成績(jī) 再年齡 的方式排序,并將結(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?boot?executable?jar/war?原理解析
spring boot里其實(shí)不僅可以直接以 java -jar demo.jar的方式啟動(dòng),還可以把jar/war變?yōu)橐粋€(gè)可以執(zhí)行的腳本來(lái)啟動(dòng),比如./demo.jar,這篇文章主要介紹了spring?boot?executable?jar/war?原理,需要的朋友可以參考下2023-02-02微服務(wù)mybatis?typehandler使用詳解(就這一篇夠了)
TypeHandler是MyBatis框架的核心組件,實(shí)現(xiàn)數(shù)據(jù)庫(kù)表字段類型和Java?數(shù)據(jù)類型之間的相互轉(zhuǎn)換,本文介紹通過(guò)實(shí)例代碼mybatis?typehandler使用,感興趣的朋友一起看看吧2024-02-02Java數(shù)據(jù)結(jié)構(gòu)之堆(優(yōu)先隊(duì)列)詳解
堆(優(yōu)先隊(duì)列)是一種典型的數(shù)據(jù)結(jié)構(gòu),其形狀是一棵完全二叉樹(shù),一般用于求解topk問(wèn)題。本文將利用Java語(yǔ)言實(shí)現(xiàn)堆,感興趣的可以學(xué)習(xí)一下2022-07-07SpringBoot集成swagger-ui以及swagger分組顯示操作
這篇文章主要介紹了SpringBoot集成swagger-ui以及swagger分組顯示操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09java如何將map數(shù)據(jù)存入到實(shí)體類對(duì)象中
在Java編程中,經(jīng)常需要將Map集合中的數(shù)據(jù)轉(zhuǎn)換為實(shí)體類對(duì)象,這可以通過(guò)反射機(jī)制實(shí)現(xiàn),即通過(guò)遍歷Map對(duì)象,使用反射根據(jù)鍵名對(duì)應(yīng)實(shí)體類的屬性名,動(dòng)態(tài)調(diào)用setter方法將值設(shè)置到實(shí)體對(duì)象中,這樣的操作使得數(shù)據(jù)從Map結(jié)構(gòu)轉(zhuǎn)移到了具體的JavaBean中,便于后續(xù)的操作和管理2024-09-09SpringBoot調(diào)用第三方WebService接口的操作技巧(.wsdl與.asmx類型)
這篇文章主要介紹了SpringBoot調(diào)第三方WebService接口的操作代碼(.wsdl與.asmx類型 ),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08SpringBoot使用Aspect切面攔截打印請(qǐng)求參數(shù)的示例代碼
這篇文章主要介紹了SpringBoot使用Aspect切面攔截打印請(qǐng)求參數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07Springboot集成Springbrick實(shí)現(xiàn)動(dòng)態(tài)插件的步驟詳解
這篇文章主要介紹了Springboot集成Springbrick實(shí)現(xiàn)動(dòng)態(tài)插件的詳細(xì)過(guò)程,文中的流程通過(guò)代碼示例介紹的非常詳細(xì),感興趣的同學(xué)可以參考一下2023-06-06SpringBoot 枚舉類型的自動(dòng)轉(zhuǎn)換的實(shí)現(xiàn)
一般我們?cè)跀?shù)據(jù)庫(kù)都會(huì)定義數(shù)值型的枚舉常量,不管是序列化還是反序列化都是需要我們手動(dòng)去轉(zhuǎn)換成枚舉類型的,本文主要介紹了Spring Boot 枚舉類型的自動(dòng)轉(zhuǎn)換,感興趣的可以了解一下2022-03-03