2015-04-04 85 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)将被视为重复,并且仅打印添加的第一个值,因此不会比较此字符串。

尝试颠倒组合值的添加顺序,您将得到您的答案