2015-04-04 86 views
1
public class Drink implements Comparable { 
    public String name; 

    @Override 
    public int compareTo(Object o) { 
     return 0; 
    } 

    @Override 
    public String toString() { 
     return name; 
    } 

    public static void main(String[] args) { 
     Drink one = new Drink(); 
     Drink two = new Drink(); 
     one.name = "Coffee"; 
     two.name = "Tea"; 
     TreeSet set = new TreeSet();  
     set.add(one); 
     set.add(two); 

     Iterator itr = set.iterator(); 
     while(itr.hasNext()) { 
      System.out.println(itr.next()); //prints Tea 
     } 
    } 
} 

通常,在詞典編纂順序compareTo()方法打印,但是,當compareTo()方法在上面的代碼然後它是如何比較兩個串被重寫爲?功能重寫的compareTo()方法的

+4

它沒有比較字符串。 – 2015-04-04 16:35:57

+1

你的意思是把''Coffee''和''Tea''分配給'one.name'嗎? (看起來像一個錯字?)你的意思是'two.name =「茶」;'? – Radiodef 2015-04-04 16:48:03

+0

是的,它其實two.coffee。 – kittu 2015-04-04 16:49:24

回答

3

根據你的compareTo方法,所有的對象都是相等的,因爲你總是返回0,所以當你試圖向TreeSet添加兩個Drink對象時,只會添加第一個對象,因爲Set doesn'不允許重複。

它會更有意義,有一個這樣的實現,實際上比較名稱:

public class Drink implements Comparable<Drink> { 

    public String name; 
    @Override 
    public int compareTo(Drink o) { 
     return name.compareTo(o.name); 
    } 
    ... 
} 
+0

那麼爲什麼不先喝咖啡而不是茶呢? – kittu 2015-04-04 16:39:12

+0

@kittu這是任意的,因爲根據你的方法,所有Drink對象是相等的(爲了自然排序的目的)。 – Eran 2015-04-04 16:41:56

+0

@Radiodef我沒有注意到這一點,但即使沒有這個錯字(並且我認爲它是一個錯字),只有一個Drink實例會在兩個添加之後在TreeSet中,因爲'one'和'two'都會被刪除相等,並且Set不允許重複。 – Eran 2015-04-04 16:51:12

0

的覆蓋compareTo方法用於定製比較。在這個函數中,你根據你的業務邏輯和你的邏輯來比較兩個對象,你返回-1,0或1,其中-1表示調用對象小於被調用對象,而_1表示另一種方式。 0表示兩個對象是相等的。

在你的代碼中,現在它沒有放置任何邏輯。它只是返回一個原型價值。你可以在代碼中加入類似的東西

return name.compareTo((String)o);

如果您不使用自定義覆蓋方法,這將是默認功能。

1

由於comapareTo()方法返回0(意味着對象相等),因此set.add(two)將被視爲重複,並且僅打印添加的第一個值,因此不會比較此字符串。

嘗試顛倒組合值的添加順序,您將得到您的答案