我一直在阅读一些关于如何根据一个对象对其进行排序的教程。例如,如果我们有一个名为person的类,它有一个名为name的属性,我们只需实现Comparable接口并覆盖compareTo。
但是,不同的教程会显示您在compareTo中编写的不同代码,例如此处为one way:
public int compareTo(Object o) throws ClassCastException {
Date d = (Date)o; // If this doesn't work, ClassCastException is thrown
int yd = year - d.year;
int md = month - d.month;
int dd = day - d.day;
if (yd != 0) return yd;
else if (md != 0) return md;
else return dd;
}
但是这里是different way来编写compareTo方法:
@Override
public int compareTo(Student1 o) {
return Integer.compare(grade, o.grade);
}
因此,我完全混淆了编写正确的compareTo
需要什么算法或公式答案 0 :(得分:4)
这完全取决于接口Comparable
的实现方式。
如果你在课堂上看到
implements Comparable
然后第一个compareTo
方法是正确的。这是通过Java 1.4实现Comparable
的方法,这是引入泛型之前的最后一个版本。它正在实现 raw 接口Comparable
(没有任何泛型)。
如果你在课堂上看到
implements Comparable<Student1>
然后第二个compareTo
方法是正确的。在这种情况下,泛型通过在compareTo
方法中提供参数类型来帮助。
两者都是对的,但第一个是过时的,第二个现在受到青睐。
答案 1 :(得分:0)
这完全取决于你所做的比较。覆盖compareTo
的原因是为您的Object定义自定义排序。 compareTo(Object another)
的合同是您必须返回:
如果此实例小于另一个,则为负整数;如果此实例大于另一个实例,则为正整数;如果此实例与另一个实例具有相同的顺序,则为0。
因此,如果您有一名学生,并且您希望按年龄排序,并且您有一个整数年龄字段,则可以使用Integer.compare(age, another.age)
,如上所示。如果您的要求更复杂,您只需定义逻辑以确定对象的自然顺序。