覆盖compareTo()方法的功能

时间:2015-04-04 16:34:33

标签: java comparable

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()方法被覆盖时,它是如何比较两个字符串的?

3 个答案:

答案 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);

如果您没有放置自定义覆盖方法,这将是默认功能。