我有一个文件数组,我试图按上次修改日期排序:
Arrays.sort(myFiles, new Comparator<File>(){
public int compare(File f1, File f2) {
return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
}
});
我没有看到这种问题。如果文件不存在,则lastModified应返回0。但是,有时我会遇到以下异常:
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:2038)
at com.myapp.MyManager.getFiles(MyManager.java:101)
at com.myapp.MyManager$2.run(MyManager.java:171)
at java.lang.Thread.run(Thread.java:856)
为什么会发生这种情况?
答案 0 :(得分:4)
public int compare(File f1, File f2) {
return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
}
你在第二个操作数上忘了 Long.valueOf ..
public int compare(File f1, File f2) {
return Long.valueOf(f1.lastModified()).compareTo(
Long.valueOf(f2.lastModified()));
}
这可能会给你带来问题..
答案 1 :(得分:2)
我猜你是&#34;修改&#34;排序期间的文件(或至少更新上次修改的时间)。这意味着分拣机会看到类似A < B
,B < C
和C < A
的内容,此时它会因为认为您的compare
函数必须被破坏而死亡。
您正在排序被其他进程修改的文件吗?查看修改时间也有可能更新修改时间,这显然会破坏这种情况。