【问题标题】:CompareTo and collections.sort() errorsCompareTo 和 collections.sort() 错误
【发布时间】:2014-03-11 23:37:57
【问题描述】:

我在使用 collections.sort 时遇到了问题,因为它没有对任何东西进行排序。我有两个类,一个类有一个比较日期的 compareTo 方法,另一个类有一个 Collections.sort 对日期进行排序。我的代码编译并运行没有错误,但 ArrayList 未排序,有人可以告诉我我做错了什么以及为什么 Collections.sort 不起作用。

代码如下:

public class CalendarDate implements Comparable<CalendarDate>{ 

    private int month;
    private int day;

    //Constructor
    public CalendarDate(int month, int day){
        this.month = month;
        this.day = day;
    }

    //CompareTo method
    public int CompareTo(CalendarDate other){
        if(month != other.month){
             return month - other.month;
        } 
        else {
            return day - other.day;
        }
    }


    //Getters
    public int getMonth(){
        return month;
    }

    public int getDay(){
        return day;
    }

    //toString method
    public String toString(){
        return month + "/" + day;
    }

public int compareTo(CalendarDate other) {
    return 0;
}
}

import java.util.*;


public class CalendarDateSort {
public static void main(String[] args){

    ArrayList<CalendarDate> list = new ArrayList<CalendarDate>();

    list.add(new CalendarDate(1, 11)); 
    list.add(new CalendarDate(5, 15 )); 
    list.add(new CalendarDate(3, 8)); 
    list.add(new CalendarDate(7, 10)); 
    list.add(new CalendarDate(3, 16)); 


    System.out.println("dates before sorting = " + list);
    Collections.sort(list);
    System.out.println("dates after sorting = " + list);        
}

}

【问题讨论】:

    标签: java sorting


    【解决方案1】:

    您进行比较的CompareTo 方法有错字并且名称不同。 Java 标识符区分大小写。实际调用的compareTo 总是返回0(表示所有元素都是相等的)。

    public class CalendarDate implements Comparable<CalendarDate>{
    
        // doesn't get called by sort
        public int CompareTo(CalendarDate other){
            if(month != other.month){
                 return month - other.month;
            } 
            else {
                return day - other.day;
            }
        }
    
        // gets called by sort
        public int compareTo(CalendarDate other) {
            return 0;
        }
    }
    

    使用@Override 注释。如果你犯了这种错误,它会产生一个编译错误。

    另见Overriding and Hiding Methods

    当覆盖一个方法时,你可能想要使用@Override 注解来指示编译器你打算覆盖超类中的一个方法。如果由于某种原因,编译器检测到某个超类中不存在该方法,则会产生错误。

    【讨论】:

      【解决方案2】:

      因为您的 compareTo(CalendarDate) 方法总是返回 0。

      用伪造的CompareTo() 方法中的代码替换return 0。将@Override 注释添加到compareTo()(以及您希望与某些接口匹配的其他方法);如果您输入错误的方法名称或弄乱签名,这将导致编译器错误。

      【讨论】:

      • 它现在可以工作了,谢谢,但我现在有一个问题。我不明白为什么它必须被覆盖
      • @Ruben 当你实现compareTo时,它被称为覆盖(无论你是否注释它)。
      【解决方案3】:

      您将返回一个固定值0,这会导致列表条目永远不会被排序。 CompareTo 方法内部的逻辑需要包含在compareTo 方法中

      @Override
      public int compareTo(CalendarDate other) {
          if (month != other.month) {
              return month - other.month;
          } else {
              return day - other.day;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-09-16
        • 1970-01-01
        • 2018-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-10
        • 1970-01-01
        相关资源
        最近更新 更多