2011-09-21 169 views
1

這裏是我的代碼可比比較的Java

class ComparableTest 
{ 
    public static void main(String[] args) 
    { 
     BOX[] box = new BOX[5]; 
     box[0] = new BOX(10,8,6); 
     box[1] = new BOX(5,10,5); 
     box[2] = new BOX(8,8,8); 
     box[3] = new BOX(10,20,30); 
     box[4] = new BOX(1,2,3); 
     Arrays.sort(box); 
     for(int i=0;i<box.length;i++) 
      System.out.println(box[i]); 
    } 
} 

而且我有一個類BOX實現媲美。 現在我有幾個問題,我希望你們能夠幫助我。

1.是否在可比較的接口,系統定義的方法中聲明的方法,我可以有任何方法在比較,或它必須是compareTo只?

2.我沒有提供Arrays.sort方法的實現,那麼它如何對我的元素進行排序呢?

3.當我使用Comparator代替comparable,然後我用:

class comparatorTest 
{ 
    public static void main(String args[]) 
    { 
     Student[] students = new Student[5]; 
     Student[0] = new Student(「John」,」2000A1Ps234」,23,」Pilani」); 
     Student[1] = new Student(「Meera」,」2001A1Ps234」,23,」Pilani」); 
     Student[2] = new Student(「Kamal」,」2001A1Ps344」,23,」Pilani」); 
     Student[3] = new Student(「Ram」,」2000A2Ps644」,23,」Pilani」); 
     Student[4] = new Student(「Sham」,」2000A7Ps543」,23,」Pilani」);  
     // Sort By Name 
     Comparator c1 = new studentbyname(); 
     Arrays.sort(students,c1); 
     for(int i=0;i<students.length;i++) 
      System.out.println(students[i]); 
    } 
} 

//在上面的代碼,studentbyname implements comparator,但還是老樣子盒實現comparable .IE

class studentbyname implements comparator 
{ 
    public int compare(Object o1,Object o2) 
    { 
     Student s1 = (Student) o1; 
     Student s2 = (Student) o2; 
     return s1.getName().compareTo(s2.getName()); 
    } 
} 

現在我我在做Arrays.sort(students,c1),爲什麼我現在通過c1?

+2

您對Java中的多態性,繼承和方法重載工作沒有基本知識。先看看這些,然後你就會明白爲什麼:你需要實現compareTo,你可以傳遞不同數量的參數給似乎是相同的方法。 –

+0

你可以參考http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html – lkamal

回答

3
  1. 爲了滿足可比合同,你必須有至少的compareTo方法。你可以在你的班級中添加儘可能多的添加方法。

  2. 它在排序基於可比接口上自然順序的元素。所以排序正在調用比較到之間的元素,看看在哪個順序放置它們。

  3. 提供比較的排序方法允許排序訂購元素,要麼(一)不執行可比或(b)如果您想訂購他們在其他一些級別比「自然秩序「,由該類的定義類比執行。

當您傳遞比較器進行排序時,它會調用比較器的比較方法而不是元素的compareTo方法(如果已實施)。

看到What is an interface

看到Comparator

看到Comparable

+0

所以Comparable就像,我不知道什麼是正確的詞,但'系統定義'也就是說,它必須包含compareTo的權利? – Kraken

+1

Comparable是一個**接口**,這意味着它定義了一組必須由聲稱實現該接口的類實現的方法集。 –

+0

當我將'c'和要排序的數組一起傳遞時會發生什麼? – Kraken

1
  1. ,只要你想在一個Comparable,只要你實現compareTo您可以定義爲許多方法。這種方法可以用於檢查類進行比較的許多情況。例如,將實例插入到有序的TreeSet中時。 compareTo爲該類的所有實例提供了一般排序規則。
  2. Arrays.sort命令數組中的其自然順序爲其元素。也就是說,使用compareTo
  3. 您可以使用Comparator來定義自定義排序規則。就像你有一張桌子一樣,你可以按任何一列進行排序。您可以爲其每列定義一個Comparator,並且您仍然可以擁有類「compareTo」中定義的類內在排序規則(如與類表示的現實相關)。