Java中Comparator與Comparable排序的區(qū)別詳解
場(chǎng)景
java中進(jìn)行排序比較時(shí)Comparator與Comparable區(qū)別:
如果你有一個(gè)類,希望支持同類型的自定義比較策略,可以實(shí)現(xiàn)接口Comparable
如果某個(gè)類,沒有實(shí)現(xiàn)Comparable,但是又希望對(duì)它進(jìn)行比較,則可以自定義一個(gè)Comparator,來定義這個(gè)類的比較規(guī)則
使用Comparable進(jìn)行排序比較
新建類CompareDemo,并添加code和age屬性,該類實(shí)現(xiàn)Comparable接口
并重新compareTo方法
public class CompareDemo implements Comparable<CompareDemo>{
int code;
int age;
public CompareDemo(int code, int age) {
this.code = code;
this.age = age;
}
@Override
public int compareTo(CompareDemo o) {
if(code == o.code){
return 0;
}else if(code<o.code){
return -1;
}else{
return 0;
}
}
}進(jìn)行排序比較,默認(rèn)根據(jù)code進(jìn)行升序比較
List<CompareDemo> list = new ArrayList<CompareDemo>(){{
add(new CompareDemo(10,20));
add(new CompareDemo(12,30));
add(new CompareDemo(11,10));
}};
list.forEach(compareDemo -> System.out.println(compareDemo.code));
//默認(rèn)根據(jù)code進(jìn)行升序比較
list.sort(null);
list.forEach(compareDemo -> System.out.println(compareDemo.code));如果現(xiàn)在需求變了,希望針對(duì)age字段,進(jìn)行升序排序,那么就可以利用Comparator實(shí)現(xiàn)。
使用Comparator進(jìn)行排序
list.sort(new Comparator<CompareDemo>() {
@Override
public int compare(CompareDemo o1, CompareDemo o2) {
if (o1.age == o2.age) {
return 0;
} else if (o1.age < o2.age) {
return -1;
} else {
return 1;
}
}
});
list.forEach(compareDemo -> System.out.println(compareDemo.age));上面的排序可以簡(jiǎn)化為
list.sort(new Comparator<CompareDemo>() {
@Override
public int compare(CompareDemo o1, CompareDemo o2) {
return Integer.compare(o1.age,o2.age);
}
});在JDK1.8中還可以更簡(jiǎn)化
list.sort(Comparator.comparingInt(o -> o.age));
如果希望倒序
list.sort(new Comparator<CompareDemo>() {
@Override
public int compare(CompareDemo o1, CompareDemo o2) {
return Integer.compare(o2.age,o1.age);
}
});在jdk1.8中,使用負(fù)數(shù)
list.sort(Comparator.comparingInt(o->-o.age)); list.forEach(compareDemo -> System.out.println(compareDemo.age));
到此這篇關(guān)于Java中Comparator與Comparable排序的區(qū)別詳解的文章就介紹到這了,更多相關(guān)Comparator與Comparable區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot 自定義校驗(yàn)代碼實(shí)例
這篇文章主要介紹了Springboot 自定義校驗(yàn)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
Java設(shè)計(jì)模式中的策略模式詳細(xì)解析
這篇文章主要介紹了Java設(shè)計(jì)模式中的策略模式詳細(xì)解析,所謂策略模式,指的是做某一件事時(shí)有多種選擇(即策略),且不同的策略之間相互獨(dú)立,而且無論使用哪種策略,得到的結(jié)果都是相同的,需要的朋友可以參考下2023-12-12
java字符轉(zhuǎn)碼的三種方法總結(jié)及實(shí)例
這篇文章主要介紹了 java字符轉(zhuǎn)碼的三種方法總結(jié)及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03
JAVA實(shí)現(xiàn)漢字轉(zhuǎn)拼音功能代碼實(shí)例
這篇文章主要介紹了JAVA實(shí)現(xiàn)漢字轉(zhuǎn)拼音功能代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Java泛化調(diào)用實(shí)現(xiàn)原理解析
泛化調(diào)用指的是不依賴服務(wù)接口的本地?stub?或代理類,通過統(tǒng)一的參數(shù)結(jié)構(gòu)動(dòng)態(tài)調(diào)用遠(yuǎn)程服務(wù)方法,本文介紹Java泛化調(diào)用實(shí)現(xiàn)原理解析,感興趣的朋友跟隨小編一起看看吧2025-12-12
spring @Scheduled注解的使用誤區(qū)及解決
這篇文章主要介紹了spring @Scheduled注解的使用誤區(qū)及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
利用ScriptEngineManager實(shí)現(xiàn)字符串公式靈活計(jì)算的方法
今天小編就為大家分享一篇利用ScriptEngineManager實(shí)現(xiàn)字符串公式靈活計(jì)算的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07
詳解springmvc控制登錄用戶session失效后跳轉(zhuǎn)登錄頁(yè)面
本篇文章主要介紹了springmvc控制登錄用戶session失效后跳轉(zhuǎn)登錄頁(yè)面,session一旦失效就需要重新登陸,有興趣的同學(xué)可以了解一下。2017-01-01

