猿问

用Java列出文件的最佳方法,按修改的日期排序?

用Java列出文件的最佳方法,按修改的日期排序?

我想在目录中得到一个文件列表,但是我想对它进行排序,使最老的文件是第一位的。我的解决方案是调用File.listFiles,然后使用基于File.lastModify的列表,但我想知道是否有更好的方法。

编辑:按照建议,我目前的解决方案是使用匿名比较器:

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


阿波罗的战车
浏览 1263回答 3
3回答

慕运维8079593

我认为你的解决方案是唯一明智的方法。获取文件列表的唯一方法是使用File.listFiles()文档指出,这不能保证返回的文件的顺序。因此,您需要编写一个比较器用File.lastModified()和文件数组一起传递给Arrays.Sort().

守着星空守着你

如果您有许多文件,这可能会更快。这使用装饰-排序-取消装饰模式,以便每个文件的最后修改日期仅被获取。一次而不是每次排序算法比较两个文件。这可能会减少从O(N Logn)到O(N)的I/O调用数。但是,这是更多的代码,所以只有当您主要关注速度时,才应该使用它,并且它在实践中要快得多(我还没有检查过)。class&nbsp;Pair&nbsp;implements&nbsp;Comparable&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;long&nbsp;t; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;File&nbsp;f; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Pair(File&nbsp;file)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&nbsp;file; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;=&nbsp;file.lastModified(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;compareTo(Object&nbsp;o)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;u&nbsp;=&nbsp;((Pair)&nbsp;o).t; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;t&nbsp;<&nbsp;u&nbsp;?&nbsp;-1&nbsp;:&nbsp;t&nbsp;==&nbsp;u&nbsp;?&nbsp;0&nbsp;:&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;}};//&nbsp;Obtain&nbsp;the&nbsp;array&nbsp;of&nbsp;(file,&nbsp;timestamp)&nbsp;pairs.File[]&nbsp;files&nbsp;=&nbsp;directory.listFiles();Pair[]&nbsp;pairs&nbsp;=&nbsp;new&nbsp;Pair[files.length]; &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;files.length;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;pairs[i]&nbsp;=&nbsp;new&nbsp;Pair(files[i]);//&nbsp;Sort&nbsp;them&nbsp;by&nbsp;timestamp.Arrays.sort(pairs);//&nbsp;Take&nbsp;the&nbsp;sorted&nbsp;pairs&nbsp;and&nbsp;extract&nbsp;only&nbsp;the&nbsp;file&nbsp;part, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;discarding&nbsp;the&nbsp;timestamp.for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;files.length;&nbsp;i++) &nbsp;&nbsp;&nbsp;&nbsp;files[i]&nbsp;=&nbsp;pairs[i].f;
随时随地看视频慕课网APP

相关分类

Java
我要回答