【问题标题】:new to java - how to write compareTo method for sortingjava新手 - 如何编写用于排序的 compareTo 方法
【发布时间】:2014-02-14 22:04:47
【问题描述】:

我已经阅读了一些关于如何根据对象的属性对对象进行排序的教程。例如,如果我们有一个名为 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 需要什么算法或公式

【问题讨论】:

    标签: java android sorting


    【解决方案1】:

    这完全取决于接口Comparable是如何实现的。

    如果你在课堂上看到

    implements Comparable
    

    那么第一个compareTo 方法是正确的。这是通过 Java 1.4 实现 Comparable 的方式,Java 1.4 是引入 generics 之前的最后一个版本。它正在实现 raw 接口 Comparable(没有任何泛型)。

    如果你在课堂上看到

    implements Comparable<Student1>
    

    那么第二个compareTo 方法是正确的。在这种情况下,泛型通过在 compareTo 方法中提供参数的类型来提供帮助。

    两者都是正确的,但第一个已经过时,而第二个现在受到青睐。

    【讨论】:

      【解决方案2】:

      这一切都取决于您要比较的内容。覆盖compareTo 的原因是为您的对象定义自定义排序。 compareTo(Object another)的约定是必须返回:

      如果此实例小于另一个实例,则为负整数;如果此实例大于另一个实例,则为正整数;如果此实例与另一个实例具有相同的顺序,则为 0。

      因此,如果您有一个学生并且您想按他们的年龄排序,并且您有一个整数年龄字段,您可以使用Integer.compare(age, another.age),如上所示。如果您的要求更复杂,您只需定义决定对象自然顺序的逻辑。

      【讨论】:

        猜你喜欢
        • 2014-03-21
        • 1970-01-01
        • 2018-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多