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

2番目のオペランドの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 < CC < Acompare

別のプロセスによって変更されているファイルを並べ替えていますか?変更された時刻を表示すると、変更された時刻が更新される可能性もあります。これにより、明らかにこの種の問題が発生します。

于 2012-10-10T19:10:43.450 に答える