Comparable


jdk1.2新增的接口,位於java.lang包下。在jdk5時Comparable<Object>改成了Comparable<T>

功能:用於對象的排序或者對象的分組

介紹:Comparable接口強行對實現它的類的每個實例進行自然排序,該接口的唯一方法compareTo方法被稱為自然比較方法;強烈建議自然排序和equals一致(就是兩個對象調用compareTo方法和調用equals方法返回的布爾值應該一樣)

方法: int compareTo(Object   o)  

利用當前對象和傳入的目標對象進行比較,若是當前對象比目標對象大,則返回1,那么當前對象會排在目標對象的后面

                      若是當前對象比目標對象小,則返回-1,那么當前對象會排在目標對象的后面

                       若是兩個對象相等,則返回0

 

例子①:對狗狗按照年齡進行升序排序

public class Main {
public static void main(String[]args){
List list = new ArrayList();
list.add(new Dog(6,"旺財"));
list.add(new Dog(3,"皮諾"));
list.add(new Dog(5,"子彈"));

for(int i=0;i<list.size();i++){
System.out.println(list.get(i).toString());
}
Collections.sort(list);
System.out.println("調用sort排序后");
for(int i=0;i<list.size();i++){
System.out.println(list.get(i).toString());
}

}
}

class Dog implements Comparable{
public int age;
public String name;
public Dog(int age,String name){
this.age=age;
this.name=name;
}

@Override
public String toString(){
return "Dog [age="+age+",name="+name+"]";
}

@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
Dog d =(Dog)o;
if(this.age>d.age) return 1;
if(this.age<d.age) return -1;
return 0;
}
}

輸出結果:

思考:如何進行降序呢?

     答:在重寫compareTo方法時,可以反過來寫,如果當前狗狗的年齡對目標狗狗的年齡大的話,則返回-1。這樣就可以達到降序的目的

 

例子①擴展:

如果使用一些自帶排序的集合容器,那么還會按照我們compareTo中定義的那樣來排序嗎?

僅對主函數進行修改

public class Main {
public static void main(String[]args){
Set<Dog> set = new TreeSet();
set.add(new Dog(6,"旺財"));
set.add(new Dog(3,"皮諾"));
set.add(new Dog(5,"子彈"));

for(Dog d:set){
System.out.println(d.toString());
}

}
}

輸出結果:

由此可得結論:若是A類實現了Compareble接口,並且重寫了compareTo()方法

        ①:當你在使用Collections/Arrays的sort對該A的對象集合進行排序時,它會按照compareTo()方法中定義的那樣進行排序

        ②:當你使用會自動排序的容器(TreeSet、TreeMap)來存A的對象時,它也會按照compareTo()方法中定義的那樣進行排序

        ③:這個只是簡單的根據年齡進行比較,在一些場景下可以寫的更豐富,比如在年齡相等的情況下根據其他的東西進行排序等

 

質疑:網上很多人都說Comparable是一個排序的接口,事實真的是如此嗎?

解答:因為Comparable在排序上用的比較多,所以很多人對它有誤解。其實Comparable是一個比較器,只是用來比較兩個對象的區別,除了排序,它還可以用來進行分組(還有其他作用,這里不深究)

 

缺點:Comparable和目標類的耦合度太高,如果對比較算法不滿意,或者目標類沒有實現Comparable接口,就得對原來的代碼進行修改,這一點不符合設計模式的開閉原則(對擴展開放,對修改關閉)

    因此在這里引入Comparator接口,在后面的時間里再給大家介紹這個接口

 

最后,以上是我個人學習所得以及個人結論,如有不對的對方歡迎大家指出,在此感謝

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM