CompareTo和collections.sort()错误

时间:2014-03-11 23:37:58

标签: java sorting

我遇到了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);        
}

}

3 个答案:

答案 0 :(得分:3)

进行比较的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注释来指示编译器您要覆盖超类中的方法。如果由于某种原因,编译器检测到该方法在其中一个超类中不存在,那么它将生成错误。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

因为您的compareTo(CalendarDate)方法始终返回0。

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