Java 在JDK1.7上使用MOFIF date对文件数组排序时出现IllegalArgumentException

Java 在JDK1.7上使用MOFIF date对文件数组排序时出现IllegalArgumentException,java,sorting,java-7,Java,Sorting,Java 7,我在Java 7虚拟机上排序文件数组时遇到一些问题。有时我会从TimSort那里得到IllegalArgumentException,抱怨“比较法违反了它的总合同!”。比较器相对简单: final File[] filesList = importDirectory.listFiles(); Arrays.sort(filesList, new Comparator<File>() { public int compare(File f1, File f2) {

我在Java 7虚拟机上排序文件数组时遇到一些问题。有时我会从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());
    }
});
final File[]filesList=importDirectory.listFiles();
sort(filesList,newcomparator(){
公共整数比较(文件f1、文件f2){
返回Long.valueOf(f1.lastModified()).compareTo(f2.lastModified());
}
});
这个实现有什么问题?为什么它在Java6VM上没有失败(我已经读到,Java7中使用的TimSort算法比Java6的普通合并排序更严格,但是我仍然看不出我在哪里违反了comparator契约


Chris

这将导致其中一个文件在排序时被修改

一种使之更快(因为lastModified很昂贵)并避免此问题的方法是构建修改日期的映射

Map<File, Long> lastModifiedMap = 
Map lastModifiedMap=

旁注:您可以将
Long.valueOf(f1.lastModified()).compareTo(f2.lastModified())
替换为更高效的:
f1.lastModified()-f2.lastModified()
不,您实际上不能,因为lastModified()返回一个
long
compare
必须返回一个
int
。您必须钳制产生的差异,因为它可能更大(或更小)小于
int
s的可用范围。在我的情况下,文件位于一个目录中,并且应用程序已启动。最初我必须对文件进行排序,以首先处理最旧的文件。因此我怀疑这是否是失败的原因。但感谢优化提示:-)好的。。。结果证明你是对的。我的代码是由Spring方法调用JobDetailFactoryBean执行的,该方法由石英计时器触发。不幸的是,如果执行时间超过10秒,则作业似乎执行了多次。在本例中,我尝试对一个数组进行排序,其中一些文件已被并行作业移动。我在我的spring配置中添加了“concurrent=false”,并且运行得很好。。。由于您的优化速度比以前快了一点:-)。。。谢谢彼得:-)