日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品99久久久久久动医院 | 国产99久久久久久免费看 | 国产精彩视频在线观看 | 成年人网站在线观看视频 | 日韩高清中文字幕 | 一本一道久久综合狠狠老精东影业 | 国产视频123区 | 综合av第一页| 成人吃奶视频 | 国产成人亚洲精品自产在线 | 久久国产情侣 | 国产21区| 欧美性网址| 亚洲国产一区二区三区在线观看 | 夜夜嗨av一区二区三区免费区 | 99国产成人精品 | 国产淫片 | 精品无码一区二区三区蜜臀 | 久操视频精品 | 97精品| av导航站 | 在线观看成人网 | 欧美日韩国产成人 | 中文字幕免费 | 蜜桃av免费 | av网站在线免费观看 | 欧美激情久久久 | 亚洲射| av巨作 | 日韩电影精品 | 永久免费快色 | 国产精彩视频一区 | 日韩中文字幕影院 | 羞羞软件 | 欧美日韩国产免费 | 久久久久久久人妻无码中文字幕爆 | 深夜福利视频网站 | 狠狠ri| 最近中文字幕无免费 | 欧美另类tv| 婷婷激情综合网 | 337p亚洲精品色噜噜噜 | 精品自拍一区 | 亚洲天堂色 | 国产免费福利视频 | 国产一区二区三区高清 | 少妇在线播放 | 一本色道久久综合亚洲 | av女星全部名单 | 67194成人在线观看 | 久久黄色精品视频 | 国产精品一区二区在线观看 | 无套爆插 | 亚洲精品中文字幕在线 | 国产日韩大片 | 国产在线视频一区 | 奇米精品一区二区三区在线观看 | 五月丁香花| 国产精品免费视频一区 | 欧美精品一区二区三区在线播放 | 麻豆出品 | 免费国产一级 | 91看片在线| 奇米二区| 91高跟黑色丝袜呻吟在线观看 | 91免费污视频 | 国产精品女人精品久久久天天 | 69堂精品 | 国产免费无码一区二区视频 | www三级免费 | 57pao成人国产永久免费视频 | 久久免费国产视频 | 蜜臀av在线观看 | 第一页综合 | 国精产品一区二区三区 | 亚洲成在线| 夜夜天天 | 日本乱淫视频 | 中国老熟妇自拍hd发布 | 老司机在线永久免费观看 | 久久伊人在 | 欧美在线观看一区二区三区 | 亚洲色图国产 | 国语对白做受xxxxx在线中国 | 日日躁夜夜躁白天躁晚上躁91 | 亚洲第一黄色网 | 国产精品揄拍100视频 | 日少妇视频| 麻豆精品av| 国产大学生自拍视频 | 中文字幕乱码中文乱码777 | 中文字幕人成人乱码亚洲电影 | 一区av在线 | 打开每日更新在线观看 | 久久精品无码人妻 | 快播91 | 午夜片在线观看 | 国产九九九九九 | 视频毛片|