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()
方法被覆盖时,它是如何比较两个字符串的?
答案 0 :(得分:3)
根据您的compareTo方法,所有对象彼此相等,因为您总是返回0,所以当您尝试向TreeSet添加两个Drink对象时,只会添加第一个,因为Set不会#39 ; t允许重复。
拥有这样的实现更有意义,它实际上比较了名称:
public class Drink implements Comparable<Drink> {
public String name;
@Override
public int compareTo(Drink o) {
return name.compareTo(o.name);
}
...
}
答案 1 :(得分:1)
由于comapareTo()
方法返回0(意味着对象相等),因此不会比较此字符串,因此set.add(two)
将被视为重复,并且只会打印第一个添加的值。
尝试将值的添加顺序颠倒过来,您将得到答案
答案 2 :(得分:0)
重写的compareTo方法用于自定义比较。在此函数中,您根据业务逻辑比较两个对象,并根据您的逻辑返回-1,0或1,其中-1表示调用对象小于调用对象,而_1表示另一种方式。 0表示两个对象都相等。
在你的代码中,现在它没有任何逻辑。它只是返回原型值。您可以在代码中添加类似的内容
返回name.compareTo((String)o);
如果您没有放置自定义覆盖方法,这将是默认功能。