java的新手 - 如何编写compareTo方法进行排序

时间:2014-02-14 22:04:48

标签: java android sorting

我一直在阅读一些关于如何根据一个对象对其进行排序的教程。例如,如果我们有一个名为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

需要什么算法或公式

2 个答案:

答案 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),如上所示。如果您的要求更复杂,您只需定义逻辑以确定对象的自然顺序。