实现自定义compareTo

时间:2013-09-12 07:15:52

标签: java compareto

@Override
public int compareTo(Object t) 
{
    if(t instanceof Student)
    {
        Student s = (Student)t;
        return (this.name.compareTo(s.name));
    }
    else
        return -1;
}

这是我的compareTo方法实现,用于根据名称比较两个Student对象。是否可以根据多个字段比较两个这样的对象,即名称和年龄?

4 个答案:

答案 0 :(得分:15)

是的,但首先您应该键入您正在实施的Comparable接口。这是它应该是什么样子:

public class Student implements Comparable<Student> {
    private int age;
    private String name;
    @Override
    public int compareTo(Student s) {
        if (name.equals(s.name))
            return age - s.age;
        return name.compareTo(s.name));
    }
}

请注意,对于类型化接口Comparable<Student>而不是原始类型Comparable,不需要强制转换。

答案 1 :(得分:3)

是的,可以使用Comparator interface compare方法根据不同的排序顺序比较两个对象。

您需要创建一个排序序列类。 Sorting user defined objects using comparator

答案 2 :(得分:1)

Apache CompareToBuilder课程值得一提。

您可以使用或不使用反射实现

public int compareTo(Object o) {
    return CompareToBuilder.reflectionCompare(this, o);
}

答案 3 :(得分:0)

请注意,您在上述代码中使用overloading compareTo方法,而不是覆盖它。

您正在实施的interface

public interface Comparable<T> {
    public int compareTo(T o);
}

您的实施:

@Override
public int compareTo(Object t) {
    //...
}

此界面的原作者Josh Bloch在他的书Effective Java中建议仅仅因为这个原因使用@Override注释;超载引起的错误很难发现。

你说你想要“基于多个字段”来比较这些对象 - 我不确定这是否意味着“基于两个字段对它们进行单向排序”或“以多种方式对它们进行排序,每种方式都基于单个字段” 。这两种情况都是可能的,如此处的其他答案所示。

然而,这是底线:

如果您要自己创建一个类,并且想要为此类定义“自然顺序”,则应该实现Comparable<T>。如果您想定义多个排序或者您不控制有问题的类,请在实现Comparator<T>的类中定义您自己的排序(参见here)。