很抱歉,又是一个问题,但我根本不明白这里发生了什么,或者我哪里出了问题。
概述:我有一个包含多个电影
- 对象的ArrayList
。这些对象有一个日期
和一个开始时间
。我想按以下条件对它们进行排序,优先级如下所示:
日期
开始时间
但是这样做时,我收到以下错误:
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:864)
at java.util.TimSort.mergeAt(TimSort.java:481)
at java.util.TimSort.mergeForceCollapse(TimSort.java:422)
at java.util.TimSort.sort(TimSort.java:219)
at java.util.TimSort.sort(TimSort.java:169)
at java.util.Arrays.sort(Arrays.java:2010)
at java.util.Collections.sort(Collections.java:1883)
at org.pbdevelopement.cineapp.MainActivity.sortByStartingTime(MainActivity.java:208)
我所拥有的:
我在 JavaFX 项目中也发生了同样的事情,但我使用 ArrayList.sort() 而不是 Collections.sort() 进行排序。我需要转换为 Collections.sort()
,因为显然 Android 还不支持 ArrayList.sort()
方法。
这是启动排序并定义Comperator
的方法:
private ArrayList<Movie> sortByStartingTime(ArrayList<Movie> list) {
Collections.sort(list, new Comparator<Movie>() { //This line is MainActivity.java: 208 ;)
@Override
public int compare(Movie o1, Movie o2) {
int comparison = o1.getDate().compareTo(o2.getDate());
if (comparison == 0) {
return o1.getStartingTime().compareTo(o2.getStartingTime());
}
return comparison;
}
});
return list;
}
如您所见,我比较了电影中的两个日期
,如果它们相等,我继续比较开始时间。
以下是我的 DateKeeper
和 TimeKeeper
类中的两个 compare()
方法(我也许应该承认它们是自己编写的):
public int compareTo(DateKeeper toCompare) {
Calendar startDate = getAsCalendar();
Calendar endDate = toCompare.getAsCalendar();
long diff = endDate.getTimeInMillis() - startDate.getTimeInMillis();//in Milli seconds
return (int) (diff / (1000 * 60 * 60 * 24));
}
我不返回-1
、0
或1
,因为我想使用此方法以及两个日期之间的差异。我已经阅读了 compare
方法,发现这应该不是问题。
public int compareTo(TimeKeeper toCompare) {
int toReturn = Integer.compare(this.getValue(), toCompare.getValue());
return toReturn;
}
getValue()
只是返回所谓的 MINUTES_OF_DAY
。
我不明白这如何违反了方法契约。据我所知,Comperator
是传递的(或者不是?)自反的和对称的。那么为什么我会收到此错误消息?
最佳答案
您的问题是,您在减去后除以当天的毫秒数。这可能会导致两个节目相隔 <24 小时,但在不同的日子显示为同一天。 尝试:
public int compareTo(DateKeeper toCompare) {
Calendar startDate = getAsCalendar();
Calendar endDate = toCompare.getAsCalendar();
long diff = (endDate.getTimeInMillis()/ (1000 * 60 * 60 * 24)) - (startDate.getTimeInMillis()/ (1000 * 60 * 60 * 24));//in Milli seconds
return (int) diff;
}
或将两个日历对象上的时间设置为午夜
关于java - 非法参数异常 : Comparison method violates general contract,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35502728/