Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写的compareTo()方法的功能_Java_Comparable - Fatal编程技术网

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(一)的顺序
设置。添加(两个),它打印茶叶。