0

Java7仮想マシンでファイルの配列を並べ替える際に問題が発生しました。時々、TimSortからIllegalArgumentExceptionが発生し、「比較メソッドはその一般的なコントラクトに違反しています!」と不平を言います。コンパレータは比較的単純です。

final File[] filesList = importDirectory.listFiles();
Arrays.sort(filesList, new Comparator<File>() {
    public int compare(File f1, File f2) {
        return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
    }
});

この実装の何が問題になっていますか?そして、なぜJava 6 VMで失敗しないのですか(Java7で使用されるTimSortアルゴリズムは、通常のマージソートのJava 6よりも制限が厳しいことを読みましたが、違反している場所がわかりません。コンパレータ契約。

クリス

4

1 に答える 1

2

これは、ファイルを並べ替えているときに変更されたファイルの 1 つを壊します。

これを高速化し (lastModified はコストがかかるため)、この問題を回避する 1 つの方法は、変更日のマップを作成することです。

Map<File, Long> lastModifiedMap = 
于 2012-07-18T16:41:01.530 に答える