排序数组时出现异常

时间:2012-10-10 19:08:36

标签: java sorting

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

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)

为什么会发生这种情况?

2 个答案:

答案 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 < BB < CC < A的内容,此时它会因为认为您的compare函数必须被破坏而死亡。

您正在排序被其他进程修改的文件吗?查看修改时间也有可能更新修改时间,这显然会破坏这种情况。