日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Comparable接口和Comparator接口的比较

發(fā)布時間:2024/10/14 编程问答 142 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Comparable接口和Comparator接口的比较 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.Comparable詳解

1.1Comparable概述

來自java.lang.Comparable。Comparable是 排序接口。若一個類實現(xiàn)了Comparable接口,就意味著該類支持排序。實現(xiàn)了Comparable接口的類的對象的列表或數(shù)組可以通過Collections.sort或Arrays.sort進(jìn)行自動排序。
此外,實現(xiàn)此接口的對象可以用作有序映射中的鍵或有序集合中的集合,無需指定比較器。
此 接口只有一個方法compareTo,比較此對象與指定對象的順序,如果該對象小
于、等于或大于指定對象,則分別返回負(fù)整數(shù)、零或正整數(shù)。

對于String類實現(xiàn)了這個Comparable接口(Integer也實現(xiàn)這接口)進(jìn)行升序排列,并完成了比較規(guī)則的定義,但是這樣就把這種規(guī)則寫死了,那比如我想要字符串按照第一個字符降序排列,那么這樣就要修改String的源代碼,修改源碼這件事這是不可能的了!,
例子:

package untl; import java.util.Arrays; public class MyComparable {public static void main(String[] args) {String arr[]={"aaa","bbb","ccc","ttt","ddd"};jiuArrays.sort(arr);for (String str:arr) {System.out.println(str);}} } 運行結(jié)果: aaa bbb ccc ddd ttt

但是如果是我們自定義的類,我們可以重寫comepareTo()方法,再利用工具類進(jìn)行排序,這樣按照我們想要的方式進(jìn)行排序:

package untl; import java.util.Arrays; public class MyComparable {public static void main(String[] args) {student stu[]={new student("張三",14),new student("李四",19),new student("王五",17)};Arrays.sort(stu);for (student s: stu) {System.out.println(s);}} } class student implements Comparable<student>{private String name;private int age;public student(String name,int age){this.age=age;this.name=name;}public int compareTo(student stu){if(stu.age<this.age)return 1;//意思是按照升序排列else if(stu.age>this.age)return -1;elsereturn 0;}// public int compareTo(student stu)// {// return this.age-stu.age;// }//上述兩個compareTo等效public String toString(){return "姓名"+this.name+" 年齡"+this.age;}} 運行結(jié)果: 姓名張三 年齡14 姓名王五 年齡17 姓名李四 年齡19

這里博主講一下compareTo()返回值的意義:

JDK官方默認(rèn)是升序

對于這段代碼

return this.age-stu.age;

其實這段代碼等價于:

if (this.age-stu.age>0)return 1;else if(this.age-stu.age<0)return -1;elsereturn 0;

那么如果你修改了代碼;

if (this.age-stu.age>0)return -1;else if(this.age-stu.age<0)return 1;elsereturn 0;

就會把默認(rèn)的升序排列變成降序排列
當(dāng)然降序排列也可以這么寫

return stu.age-this.age;

其實返回值1的意思是兩比較對象需要在最初的位置上交換位置,返回-1,0代表排序的時候兩比較對象最初位置不需要交換,什么意思:

package untl; import java.util.Arrays; public class MyComparable {public static void main(String[] args) {student stu[]={new student("張三",19),new student("李四",14),};for (student s: stu) {System.out.println(s);}Arrays.sort(stu);for (student s: stu) {System.out.println(s);}} } class student implements Comparable<student>{private String name;private int age;public student(String name,int age){this.age=age;this.name=name;}public int compareTo(student stu){if (this.age-stu.age>0)return 1;else if(this.age-stu.age<0)return -1;elsereturn 0;}public String toString(){return "姓名"+this.name+" 年齡"+this.age;}} 運行結(jié)果: 姓名張三 年齡19 姓名李四 年齡14 姓名李四 年齡14 姓名張三 年齡19

張三的最初位置為0,李四為1,那么由于返回值為1,所以兩者交換位置,這就是實現(xiàn)排序的基礎(chǔ),其實返回值1可以替換成一個大于的數(shù)就,-1同樣可以替換成小于0的數(shù),,正負(fù)值只是代表兩數(shù)大小的判斷

總的來說:Comparable強(qiáng)行對實現(xiàn)它的每個類的對象進(jìn)行整體排序。這種排序被稱為類的自然排序,類的compareTo方法被稱為它的自然比較方法。只能在類中實現(xiàn)compareTo()一次,不能經(jīng)常修改類的代碼實現(xiàn)自己想要的排序.,比如上述我們要按照降序排列的話就必須從新修改方法里邊的源碼
總之:
comparable是需要比較的對象來實現(xiàn)接口。這樣對象調(diào)用實現(xiàn)的方法來比較。對對象的耦合度高(需要改變對象的內(nèi)部結(jié)構(gòu),破壞性大)

2.Comparator詳解

2.1Comparator簡介

強(qiáng)行對某個對象進(jìn)行整體排序。可以將Comparator 傳遞給sort方法(如Collections.sort或 Arrays.sort),從而允許在排序順序上實現(xiàn)精確控制。還可以使用Comparator來控制某些數(shù)據(jù)結(jié)構(gòu)(如有序set或有序映射)的順序,或者為那些沒有自然順序的對象collection提供排序。
我們?nèi)绻枰刂颇硞€類的次序,而該類本身不支持排
序(即沒有實現(xiàn)Comparable接口),那么我們就可以建立一個“該類的比較器”來進(jìn)行排
序,這個“比較器”只需要實現(xiàn)Comparator接口即可。也就是說,我們可以通過實現(xiàn)
Comparator來新建一個比較器,然后通過這個比較器對類進(jìn)行排序。

2.2Comparator注意點

1.若一個類要實現(xiàn)Comparator接口:它一定要實現(xiàn)compare(T o1, T o2)函數(shù),但
可以不實現(xiàn)equals(Object obj)函數(shù)。
2.int compare(T o1, T o2) 是“比較o1和o2的大小”。返回“負(fù)數(shù)”,意味著“o1比o2
小”;返回“零”,意味著“o1等于o2”;返回“正數(shù)”,意味著“o1大于o2”。
例子:

package untl; import java.util.Arrays; import java.util.Comparator;public class MyComparable {public static void main(String[] args) {student stu[]={new student("張三",19),new student("李四",14),};for (student s: stu) {System.out.println(s);}Arrays.sort(stu,new Comparator<student>(){public int compare(student o1, student o2){return o1.getage()-o2.getage();//升序}});for (student s: stu) {System.out.println(s);}} } class student {private String name;private int age;public student(String name,int age){this.age=age;this.name=name;}public String toString(){return "姓名"+this.name+" 年齡"+this.age;}public int getage(){return age;}} 運行結(jié)果: 姓名張三 年齡19 姓名李四 年齡14 姓名李四 年齡14 姓名張三 年齡19

同樣的compare里邊的實現(xiàn)依然可以換成return 1 ,return -1的形式;

**>注意Comparator接口不是排序接口,我們必須要在Arrays或者Collections傳遞兩個參數(shù),第一個參數(shù)是集合或者數(shù)組,第二個參數(shù)則是比較器Comparator(定義比較規(guī)則)

Comparable接口和Comparator接口的比較

1.Comparable是排序接口,若一個類實現(xiàn)了Comparable接口,就意味著“該類支持
排序”。Comparator是比較器,我們?nèi)粜枰刂颇硞€類的次序,可以建立一個“該類的
比較器”來進(jìn)行排序。Comparable相當(dāng)于“內(nèi)部比較器”,而Comparator相當(dāng)于“外部比
較器”。

2.用Comparable簡單, 只要實現(xiàn)Comparable 接口的對象直接就成為一個可以比較
的對象,但是需要修改源代碼。 用Comparator 的好處是不需要修改源代碼, 而是另
外實現(xiàn)一個比較器, 當(dāng)某個自定義的對象需要作比較的時候,把比較器和對象一起傳
遞過去就可以比大小了, 并且在Comparator 里面用戶可以自己實現(xiàn)復(fù)雜的可以通用
的邏輯,使其可以匹配一些比較簡單的對象,那樣就可以節(jié)省很多重復(fù)勞動了。
3.comparable接口實際上是出自java.lan包,它有一個compareTo(Object obj)方法用來排序
comparator接口實際上是出自java.util 包,它有一個compare(Object obj1, Object obj2)方法用來排序
4.一般我們需要對一個集合使用自定義排序時,我們就要重寫compareTo方法或compare方法,當(dāng)我們需要對某一個集合實現(xiàn)兩種排序方式,比如一個song對象中的歌名和歌手名分別采用一種排序方法的話,我們可以重寫compareTo方法和使用自制的Comparator方法或者以兩個Comparator來實現(xiàn)歌名排序和歌星名排序,第二種代表我們只能使用兩個參數(shù)版的Collections.sort().

總結(jié)

以上是生活随笔為你收集整理的Comparable接口和Comparator接口的比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩成人免费在线观看 | 91九色中文 | 97超碰人人澡人人爱学生 | 欧美激情影音先锋 | 99国产精品白浆在线观看免费 | 青青草原综合网 | 日本黄色xxx | 每日在线更新av | 免费欧美在线 | 超碰男人的天堂 | 黄色动漫在线免费观看 | 日韩一区二区三区视频在线 | 免费在线观看中文字幕 | 国产三级漂亮女教师 | 一级免费a | 国产极品一区 | 在线免费一级片 | 全部毛片永久免费看 | 国产二区三区视频 | 黄网站在线观看 | 久久五 | 亚洲三级在线看 | 青草草在线观看 | 国产精品高潮呻吟视频 | 少妇高清精品毛片在线视频 | 韩国毛片视频 | 欧美日韩在线一区二区 | 色婷婷视频在线 | 精品视频久久久 | av看片网站 | 亚洲精品电影院 | 一区二区在线观看av | 日韩精品在线一区二区 | 久久精品69 | 亚洲成人av一区二区 | 国产又粗又猛又爽又黄又 | 18久久久| 自拍偷拍免费 | 一区二区中文字幕 | 秋霞影院午夜丰满少妇在线视频 | 超碰超碰在线 | 亚洲国内在线 | 久草福利视频 | 欧美黄色一级片视频 | 婷婷综合一区 | 香蕉爱爱视频 | 国产三级久久 | 瑟瑟在线视频 | hd丰满圆润的女人hd | 泽村玲子av | 亚洲AV成人无码精电影在线 | 玩偶姐姐在线看 | 2019自拍偷拍 | 操天天操 | 致命魔术电影高清在线观看 | 欧美极品一区二区三区 | 少妇一级淫片免费放中国 | 亚洲一区精品视频在线观看 | 毛片哪里看 | 久久va| aaa一区二区三区 | 精品国产av鲁一鲁一区 | 中国老熟女重囗味hdxx | 日本va视频 | 免费在线观看一区二区 | 国产一级视频在线 | 欧美一级网 | 91高清网站 | 在线播放www | 草久免费视频 | 欧美色爽 | 天天干天天操天天操 | 亚洲精品www久久久久久 | 国产精品亚洲一区二区无码 | 超碰免费公开 | 香蕉精品在线 | 免费成人av在线播放 | 成人在线网站 | 国产免费一区二区视频 | 影音先锋在线视频观看 | 欧美日韩在线视频一区二区三区 | 亚洲 欧美 变态 另类 综合 | 亚洲天堂国产精品 | 男人天堂综合 | 国产精品区一区二区三 | 欧美日韩1区2区 | 欧美色欧美 | 国产一毛片 | 日韩欧洲亚洲AV无码精品 | 女人天堂网站 | 亚洲成人观看 | 在线视频一区二区三区四区 | av网址免费在线观看 | 久久撸视频| 国产夫妻一区 | 嫩草视频在线观看免费 | 国产精品一区二区在线免费观看 | 亚洲精品视频观看 | 日韩av不卡在线观看 |