Java 重写的compareTo()方法的功能
通常,Java 重写的compareTo()方法的功能,java,comparable,Java,Comparable,通常,compareTo()方法按字典顺序打印,但是当compareTo()方法像上面的代码一样被覆盖时,它是如何比较这两个字符串的 根据您的compareTo方法,所有对象都是相等的,因为您总是返回0,所以当您尝试将两个饮料对象添加到树集合时,只会添加第一个对象,因为集合不允许重复 有这样一个实现会更有意义,它实际上比较了名称: public class Drink implements Comparable { public String name; @Override
compareTo()
方法按字典顺序打印,但是当compareTo()
方法像上面的代码一样被覆盖时,它是如何比较这两个字符串的 根据您的compareTo方法,所有对象都是相等的,因为您总是返回0,所以当您尝试将两个饮料对象添加到树集合时,只会添加第一个对象,因为集合不允许重复
有这样一个实现会更有意义,它实际上比较了名称:
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
}
}
}
公共类{
公共字符串名称;
@凌驾
公共内部比较(饮料o){
返回name.compareTo(o.name);
}
...
}
根据您的compareTo方法,所有对象都是相等的,因为您总是返回0,所以当您尝试将两个饮料对象添加到树集中时,只会添加第一个对象,因为一个集合不允许重复
有这样一个实现会更有意义,它实际上比较了名称:
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
}
}
}
公共类{
公共字符串名称;
@凌驾
公共内部比较(饮料o){
返回name.compareTo(o.name);
}
...
}
重写的compareTo方法用于自定义比较。在这个函数中,根据业务逻辑比较两个对象,并根据逻辑返回-1,0或1,其中-1表示调用对象小于调用对象,而_1表示相反。0表示两个对象相等
在您的代码中,现在它没有放入任何逻辑。它只是返回一个原型值。您可以在代码中添加类似的内容
返回name.compareTo((字符串)o)
如果不使用自定义替代方法,则这将是默认功能。替代的compareTo方法用于自定义比较。在这个函数中,根据业务逻辑比较两个对象,并根据逻辑返回-1,0或1,其中-1表示调用对象小于调用对象,而_1表示相反。0表示两个对象相等 在您的代码中,现在它没有放入任何逻辑。它只是返回一个原型值。您可以在代码中添加类似的内容 返回name.compareTo((字符串)o)
如果您不使用自定义覆盖方法,这将是默认功能。它不会比较其中的字符串,因为
comapareTo()
方法返回0(表示对象相等),因此设置。添加(两个)
将被视为重复,并且只打印第一个添加的值
尝试颠倒向集合中添加值的顺序,您将得到您的答案。由于
comapareTo()
方法返回0(表示对象相等),因此集合。添加(两个)
将被视为重复,只打印第一个添加的值
尝试颠倒向集合中添加值的顺序,您将得到您的答案。它不是在比较字符串。您的意思是将
“Coffee”
和“Tea”
分配给一个。name
?(看起来像是打字错误?)你是说two.name=“Tea”代码>?是的,它实际上是两个。coffee。它不是在比较字符串。您的意思是将“coffee”
和“Tea”
都分配给一个。name
?(看起来像是打字错误?)你是说two.name=“Tea”代码>?是的,实际上是两个。咖啡。那么为什么不先打印咖啡而不是茶呢?@kittu这是任意的,因为根据你的方法,所有的饮料对象都是相等的(为了自然排序)。@Radiodef我没有注意到这一点,但即使没有这个输入错误(我认为这是一个输入错误),在两次添加之后,树集中只有一个饮料实例,因为one
和two
都被认为是相等的,并且一个集合不允许重复。请注意,可比较的接口表示compareTo(null)应该抛出一个NullPointerException@kittu我在Eclipse、Java6上尝试了您的代码,它打印了咖啡。如果我切换set.add(一)的顺序代码>和设置。添加(两个)代码>,它打印茶。那么为什么不先打印咖啡而不是茶呢?@kittu这是任意的,因为根据你的方法,所有的饮料对象都是相等的(为了自然排序)。@Radiodef我没有注意到这一点,但即使没有这个输入错误(我认为这是一个输入错误),在添加两个之后,只有一个饮料实例会出现在TreeSet中,由于one
和two
将被视为相等,并且集合不允许重复。请注意,Comparable接口表示compareTo(null)应抛出NullPointerException@kittu我在Eclipse、Java6上尝试了您的代码,它打印了咖啡。如果我切换set.add(一)的顺序代码>和设置。添加(两个)代码>,它打印茶叶。