-1

我有一个文件数组,我试图按上次修改日期排序:

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)

任何想法为什么会发生这种情况?

4

2 回答 2

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()));
}

这可能会给你带来问题..

于 2012-10-10T19:10:40.187 回答
2

我的猜测是您在排序期间“修改”文件(或至少更新上次修改时间)。这意味着分拣机看到类似A < B,B < C和的东西C < A,此时它会死掉,因为它认为您的compare函数必须被破坏。

您是否对正在被另一个进程修改的文件进行排序?也有可能查看修改时间正在更新修改时间,这显然会破坏这种排序。

于 2012-10-10T19:10:43.450 回答