2016-05-16 171 views
-2

從下面的代碼我不理解兩件事情:的CompareTo()和比較()比較的方法和可比

  1. CompareTo()Compare()方法返回int,但如何影響排序?

  2. 該方法返回this.name.compareTo(d.name)。什麼是this.name

請詳細解釋。

import java.util.*; 

class Dog implements Comparator<Dog>, Comparable<Dog>{ 
    private String name; 
    private int age; 
    Dog(){ 
    } 

    Dog(String n, int a){ 
     name = n; 
     age = a; 
    } 

    public String getDogName(){ 
     return name; 
    } 

    public int getDogAge(){ 
     return age; 
    } 

    // Overriding the compareTo method 
    public int compareTo(Dog d){ 
     return (this.name).compareTo(d.name); 
    } 

    // Overriding the compare method to sort the age 
    public int compare(Dog d, Dog d1){ 
     return d.age - d1.age; 
    } 
} 

public class Example{ 

    public static void main(String args[]){ 
     // Takes a list o Dog objects 
     List<Dog> list = new ArrayList<Dog>(); 

     list.add(new Dog("Shaggy",3)); 
     list.add(new Dog("Lacy",2)); 
     list.add(new Dog("Roger",10)); 
     list.add(new Dog("Tommy",4)); 
     list.add(new Dog("Tammy",1)); 
     Collections.sort(list);// Sorts the array list 

     for(Dog a: list)//printing the sorted list of names 
     System.out.print(a.getDogName() + ", "); 

     // Sorts the array list using comparator 
     Collections.sort(list, new Dog()); 
     System.out.println(" "); 
     for(Dog a: list)//printing the sorted list of ages 
     System.out.print(a.getDogName() +" : "+ 
     a.getDogAge() + ", "); 
    } 
} 
+3

無論你在做什麼,這是無稽之談。 '狗'不應該執行'比較器';你應該有一個單獨的類(可能是匿名的)實現'Comparator '。與此同時,你期望'this.name'是什麼?這是這隻狗的名字,與另一隻狗相比。 –

+0

對於'比較',如果狗的年齡相同,它們是相等的。否則,如果第一隻狗比較老,它會返回一個正數,第二隻狗,負數。 – Compass

+0

@louis我對不起你 – Sri

回答

0

正如你可能猜到了,比較的compareTo用於比較兩個對象。

它是如何工作

compare(a, b)比較對象a和b。如果返回值爲< 0,則a低於b。如果它是0,則兩個對象相等。如果它優於0,則a大於b。

a.compareTo(b)也比較對象a和b。返回值的工作方式與compare相同。但是,在調用它時必須小心a不爲null,否則會拋出NullPointerException。

當使用它

如果你的類只需要一個比較方案,則僅使用compareTo是罰款。

但是,如果您需要以多種方式對Dog進行排序,例如一次您想按年齡和另一次按名稱對它們進行排序,這就是Comparator變得方便的地方。您可以創建兩個Comparator<Dog>,一個按年齡分類,另一個按名稱分類。當調用一個像sort這樣的方法時,你提供了一個你想用來比較你想要的排序的參數。

相對於你的問題

關鍵字this指當前Dog實例。所以,this.name是當前Dog實例的名稱。

0

CompareTo()用於定義對象的'自然順序',並創建一個int來確定哪個對象比其他對象'更大',並實現Comparable。

a.compareTo(b)<0 //same as a<b  
a.compareTo(b)>0 //same as a>b 
a.compareTo(b)==0 //same as a==b 
a.compareTo(b)!=0 //same as a!=b 
a.compareTo(b)<=0 //same as a<=b 
a.compareTo(b)>=0 //same as a>=b 

至於它如何排序不同於compare()完全取決於如何實現compareTo()。

下面有關於如何假設phoneNumber的具有3個字段的一個示例:AREACODE前綴LINENUMBER

public int compareTo(PhoneNumber pn){ 
       // Compare area codes 
      if (areaCode< pn.areaCode) { 
       return -1; 
      } 
      if (areaCode > pn.areaCode){ 
        return 1; 
      } 
      // Area codes are equal, compare prefixes 
      if (prefix < pn.prefix){ 
        return -1; 
      } 
      if (prefix > pn.prefix){ 
        return 1; 
      } 
      // Area codes and prefixes are equal, compare line numbers 
      if (lineNumber < pn.lineNumber){ 
        return -1; 
      } 
      if (lineNumber > pn.lineNumber){ 
        return 1; 
      } 
      return 0; // All fields are equal 
      } 

雖然比較()有兩個目的和值進行比較他們的場之間,並執行比較器

compare(a,b)<0 //same as a<b  
compare(a,b)>0 //same as a>b 
compare(a,b)==0 //same as a==b 
compare(a,b)!=0 //same as a!=b 
compare(a,b)<=0 //same as a<=b 
compare(a,b)>=0 //same as a>=b 

this答案有一個更詳細和articula對比較器和可比較的解釋。