首先,比較Comparable和Comparator的區(qū)別
目前創(chuàng)新互聯(lián)已為上1000家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、綿陽(yáng)服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、來(lái)鳳網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
Comparable Comparator 都是用來(lái)實(shí)現(xiàn)集合中的排序的,只是 Comparable 是在集合內(nèi)部定義的方法實(shí)現(xiàn)的排序,Comparator 是在集合外部實(shí)現(xiàn)的排序,所以,如想實(shí)現(xiàn)排序,就需要在集合外定義 Comparator 接口的方法或在集合內(nèi)實(shí)現(xiàn) Comparable 接口的方法。
Comparable 是一個(gè)對(duì)象本身就已經(jīng)支持自比較所需要實(shí)現(xiàn)的接口(如 String、Integer 自己就可以完成比較大小操作);
而 Comparator 是一個(gè)專用的比較器,當(dāng)這個(gè)對(duì)象不支持自比較或者自比較函數(shù)不能滿足你的要求時(shí),你可以寫一個(gè)比較器來(lái)完成兩個(gè)對(duì)象之間大小的比較。
可以說(shuō)一個(gè)是類自已完成比較,一個(gè)是外部程序?qū)崿F(xiàn)比較的差別而已。
用 Comparator 是策略模式(strategy design pattern),就是不改變對(duì)象自身,而用一個(gè)策略對(duì)象(strategy object)來(lái)改變它的行為。
從操作上:Comparable 需要在被排序的類中實(shí)現(xiàn)其接口,而Comparator 是在被排序類的外部實(shí)現(xiàn)其接口即可.這樣可以看出Comparable操作更簡(jiǎn)單,而Comparator操作復(fù)雜但是可以實(shí)現(xiàn)多種不同的排序方案.
比如:你想對(duì)整數(shù)采用絕對(duì)值大小來(lái)排序,Integer 是不符合要求的,你不能去修改 Integer 類去改變它的排序行為,只要使用一個(gè)實(shí)現(xiàn)了 Comparator 接口的對(duì)象來(lái)實(shí)現(xiàn)控制它的排序就行了。
實(shí)現(xiàn)Comparator接口,實(shí)現(xiàn)排序
在Comparator接口里,只有一個(gè)方法是需要實(shí)現(xiàn)的:
Java代碼
int compare(Object o1,Object o2);
int compare(Object o1,Object o2);
提示:如果o1小于o2,返回一個(gè)負(fù)數(shù);如果o1大于o2,返回一個(gè)正數(shù);如果他們相等,則返回0;
注意:compare方法一定要是對(duì)稱的,意思是compare(a,b)返回的結(jié)果要跟compare(b,a)相反。相反的結(jié)果意味著,要么返回的值帶有不同的正負(fù)號(hào),要么都是0。注意,象compare(a,b)返回4而compare(b,a)返回-2這樣的情況是合法的。方法里常??赡軖伋霎惓#谶@個(gè)方法里拋出異常也要是對(duì)稱的。如果調(diào)用compare(a,b)時(shí)拋出了一個(gè)ClassCastException異常,那么調(diào)用compare(b,a)時(shí)也必須拋出一個(gè)ClassCastException異常。
另外:任何你準(zhǔn)備重用的Comparator都必須是可序列化的。TreeSet和TreeMap類存儲(chǔ)Comparator以便進(jìn)行比較,因此為了這兩個(gè)類能被序列化,它們使用的Comparator也必須能被序列化。
Comparator接口,通常被Collections.sort方法使用,它是JAVA中需要了解的一個(gè)很重要的部分,因?yàn)樗幸恍┲匾钠跫s義務(wù).
基礎(chǔ)類型比較本身就只有“值”,所以排序的也就是常用的排序算法,這些都不用定義什么規(guī)則,數(shù)值大就是大,數(shù)值小就是小。實(shí)現(xiàn)細(xì)節(jié)可以查看系列Arrays.sort()方法和Collections.sort()方法。其它類型(對(duì)象),例如字符串,都要自己實(shí)現(xiàn)Comparable來(lái)告訴排序算法的比較規(guī)則。String默認(rèn)就實(shí)現(xiàn)Comparable,規(guī)則為字母序。
總結(jié)起來(lái)就是,基礎(chǔ)類型通過(guò)“值”就能明確大?。ㄒ簿褪遣挥米远x規(guī)則),非基礎(chǔ)類型(對(duì)象)需要實(shí)現(xiàn)Comparable來(lái)定義規(guī)則,否則沒(méi)法比較。
//?傳入array
int?siteIndex?=?0;
int??tempVariable?=?0;
for?(int?i?=?0;?i??array.length;?i++){
siteIndex?=?i;
for?(int?j?=?i+1;?j?array.length;?j++){
if(array[siteIndex]array[j]){
siteIndex?=?j;
}
tempVariable?=?array[i];
array[i]?=?array[siteIndex];
array[siteIndex]?=?tempVariable;
siteIndex?=?i;//?重新賦值
}
}