2016-11-18 55 views
-1

我一直在搜索,最接近的回答(不是答案)是here,但我對這個迴應感到困惑。我想用Collection.sort()來排序一些狗的名字,所以我需要學習使用Comparable接口。我的問題:爲什麼在重寫compareTo()方法時使用Comparable接口的compareTo()?

1)爲什麼我需要使用來自接口的compareTo(),當我「覆蓋」compareTo()?
2)如果來自Comparable接口的compareTo()是一個默認方法,爲什麼它在方法前沒有「default」關鍵字? Java SE 8 Menu

下面是部分代碼:

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

這裏是類實現Comparable接口:

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; 
    } 

    public int compareTo(Dog d) { 
     return (this.name).compareTo(d.name); //###.....my question 
    } 

    // Override Comparator Interface's compare() to sort "ages" 
    public int compare(Dog d, Dog d1) { 
     return d.age - d1.age; 
    } 
} 
+0

你所說的「使用」的意思是,你如何可以覆蓋的方法,而不必一個方法重寫?它在哪裏說它是一個「默認」方法?不清楚你在問什麼。 – EJP

+0

@EJP,當他們談論創建他們自己的Comparable接口的compareTo方法時,這裏有一些使用單詞「override」的文章。 https://www.tutorialspoint.com/java/java_using_comparator.htm –

+0

@EJP,此外,一個接口可以有一個默認方法,自Java 8以來已經在一個接口中實現。由於我發現的很多文章都說「覆蓋」compareTo( )當他們實現了Comparable接口並且他們調用了compareTo()這個默認方法時,我問我在文章中compareTo()是否是一個默認方法。 –

回答

0

這裏的東西思考)方法。

A Dog is Comparable to other Dog s。它本身並不是比較兩個其他Dog s。

因此,實施Comparable是「更正確的」。

而你是兩種方法相沖突。

static <T extends Comparable<? super T>> void sort(List<T> list)

對指定列表按升序進行,根據其元素的 自然排序。

因此,Collections.sort(dogs);將整理您的清單。

static <T> void sort(List<T> list, Comparator<? super T> c)

排序根據由 指定比較器產生的順序指定列表。

這就是你如何使用該方法。

Collections.sort(dogs, new Comparator<Dog>() { 
    @Override 
    public int compare(Dog d1, Dog d2) { 
     return d1.compareTo(d2); // Call the Comparable method 
    } 
)}; 

你可以,當然,實現內心的方法,按年齡訂購

return Integer.compare(d1.getAge(), d2.getAge()); 
+0

謝謝,@ cricket_007。但是,從該行實現的原始compareTo()在哪裏,返回d1.compareTo(d2); ? –

+0

'Dog implements Comparable ' –

+0

是的。那它呢? –

0

爲什麼我需要使用的compareTo()從接口來當我 「重寫」compareTo()?

這樣就可以根據所使用的數據結構定義的邏輯,所以你的情況,你所使用的不能被收集API來defaultly分類,因爲他們在原始數據類型排序不僅沒有自定義工作犬對象對象。

因此,它要求重寫compareTo()並提供自定義邏輯,現在您的關鍵字用於排序是String「name」,您可以使用它的compareTo()方法進行排序。

2)如果來自可比較的接口的compareTo()是一個默認的方法, 爲什麼不它在本方法的前一個「默認」的關鍵字?

因爲在原始數據類型排序Collections.sort()的情況下,在內部使用Arrays.sort()和沒有的compareTo的默認實現(在可比接口

+0

基於你的解釋的第一部分,在我看來,Comparable接口自帶的compareTo()已經實現了對String對象進行排序,對嗎? –

+1

@LEDFantom呃,['String implements comparable '](http://docs.oracle.com/javase/8/docs/api/java/lang/String.html) –