重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
首先,比較Comparable和Comparator的區別
目前創新互聯已為上1000家的企業提供了網站建設、域名、網站空間、綿陽服務器托管、企業網站設計、來鳳網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發展。
Comparable Comparator 都是用來實現集合中的排序的,只是 Comparable 是在集合內部定義的方法實現的排序,Comparator 是在集合外部實現的排序,所以,如想實現排序,就需要在集合外定義 Comparator 接口的方法或在集合內實現 Comparable 接口的方法。
Comparable 是一個對象本身就已經支持自比較所需要實現的接口(如 String、Integer 自己就可以完成比較大小操作);
而 Comparator 是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足你的要求時,你可以寫一個比較器來完成兩個對象之間大小的比較。
可以說一個是類自已完成比較,一個是外部程序實現比較的差別而已。
用 Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行為。
從操作上:Comparable 需要在被排序的類中實現其接口,而Comparator 是在被排序類的外部實現其接口即可.這樣可以看出Comparable操作更簡單,而Comparator操作復雜但是可以實現多種不同的排序方案.
比如:你想對整數采用絕對值大小來排序,Integer 是不符合要求的,你不能去修改 Integer 類去改變它的排序行為,只要使用一個實現了 Comparator 接口的對象來實現控制它的排序就行了。
實現Comparator接口,實現排序
在Comparator接口里,只有一個方法是需要實現的:
Java代碼
int compare(Object o1,Object o2);
int compare(Object o1,Object o2);
提示:如果o1小于o2,返回一個負數;如果o1大于o2,返回一個正數;如果他們相等,則返回0;
注意:compare方法一定要是對稱的,意思是compare(a,b)返回的結果要跟compare(b,a)相反。相反的結果意味著,要么返回的值帶有不同的正負號,要么都是0。注意,象compare(a,b)返回4而compare(b,a)返回-2這樣的情況是合法的。方法里常常可能拋出異常,在這個方法里拋出異常也要是對稱的。如果調用compare(a,b)時拋出了一個ClassCastException異常,那么調用compare(b,a)時也必須拋出一個ClassCastException異常。
另外:任何你準備重用的Comparator都必須是可序列化的。TreeSet和TreeMap類存儲Comparator以便進行比較,因此為了這兩個類能被序列化,它們使用的Comparator也必須能被序列化。
Comparator接口,通常被Collections.sort方法使用,它是JAVA中需要了解的一個很重要的部分,因為它有一些重要的契約義務.
基礎類型比較本身就只有“值”,所以排序的也就是常用的排序算法,這些都不用定義什么規則,數值大就是大,數值小就是小。實現細節可以查看系列Arrays.sort()方法和Collections.sort()方法。其它類型(對象),例如字符串,都要自己實現Comparable來告訴排序算法的比較規則。String默認就實現Comparable,規則為字母序。
總結起來就是,基礎類型通過“值”就能明確大小(也就是不用自定義規則),非基礎類型(對象)需要實現Comparable來定義規則,否則沒法比較。
//?傳入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;//?重新賦值
}
}