8
@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

4 回答 4

16

是的,但首先您应该键入您正在实现的 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));
    }
}

请注意,使用类型化的 interfaceComparable<Student>而不是原始类型Comparable,无需强制转换。

于 2013-09-12T07:43:36.367 回答
3

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

您需要创建一个排序序列类。使用比较器对用户定义的对象进行排序

于 2013-09-12T07:16:48.107 回答
1

请注意,您正在重载上述代码中的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>(参见此处)。

于 2014-12-27T05:33:58.820 回答
1

Apache CompareToBuilder类值得一提。

您可以在有或没有反射的情况下实现

public int compareTo(Object o) {
    return CompareToBuilder.reflectionCompare(this, o);
}
于 2015-03-26T23:08:33.560 回答