我遇到了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);
}
}
答案 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()
注释(以及您希望与某些界面匹配的其他方法);如果您输入方法名称或弄乱签名,这将导致编译器错误。