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