簡體   English   中英

排序數組時發生異常

[英]Exception when sorting array

我要嘗試按上次修改日期對文件進行排序:

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)

任何想法為什么會這樣?

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

這可能會給您帶來問題。

我的猜測是您正在排序期間“修改”文件(或至少更新了上次修改時間)。 這意味着排序器看到A < BB < CC < A ,此時它死了,因為它認為您的compare功能必須中斷。

您是否正在排序正在被另一個進程修改的文件? 查看修改時間也可能會更新修改時間,這顯然會破壞這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM