【发布时间】:2014-06-13 23:01:29
【问题描述】:
我在 Java 中有一个包含大量文件(约 40.000 个文件)的 ArrayList。我需要按日期升序/降序对这些文件进行排序。目前,我使用一个简单的
Collections.sort(fileList, new FileDateComparator());
FileDateComparator 在哪里
public class FileDateComparator implements Comparator<File>
{
@Override
public int compare(File o1, File o2)
{
if(o1.lastModified() < o2.lastModified())
return -1;
if(o1.lastModified()==o2.lastModified())
return 0;
return 1;
}
}
排序占用了我很长的时间,比如 20 秒或更多。有没有更有效的方法来实现这一点?我已经尝试过将 Apache I/O LastModifiedFileComparator 作为比较器,但它的实现方式似乎相同,因为它需要相同的时间。
【问题讨论】:
-
您是否尝试过将您的对象添加到 TreeSet (docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html) 以便对它们进行动态排序?
-
对
File.lastModified的每次调用都会调用内核,因此如果您想避免这种开销,您必须读取整个列表一次并将其保存在内存中(您可以使用Map<File,Long>这样做。但是加载这个缓存仍然需要时间,因为同样,您需要为每个时间戳进行内核调用。 -
TreeSet 为您提供 log(n) 查找,而不是您正在寻找的 Apache Commons Collections 中的 linear.one 结构,TreeList commons.apache.org/proper/commons-collections/javadocs/…
-
不是Best way to list files in Java, sorted by Date Modified?的完全重复,因为这个问题是关于对一长串文件进行排序的性能问题。