我想获得目录中的文件列表,但我想对其进行排序,以便最早的文件排在前面。我的解决方案是调用File。listFiles,然后根据File返回列表。lastModified,但我想知道是否有更好的方法。

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

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

当前回答

自Java 8以来的优雅解决方案:

File[] files = directory.listFiles();
Arrays.sort(files, Comparator.comparingLong(File::lastModified));

或者,如果你想让它降序排列,就把它倒过来:

File[] files = directory.listFiles();
Arrays.sort(files, Comparator.comparingLong(File::lastModified).reversed());

其他回答

有一种非常简单方便的方法来处理这个问题,不需要任何额外的比较器。只需将修改后的日期编码到具有文件名的字符串中,对其排序,然后再次将其剥离。

使用固定长度为20的字符串,将修改后的日期(长)放入其中,并以前导零填充。然后将文件名附加到这个字符串:

String modified_20_digits = ("00000000000000000000".concat(Long.toString(temp.lastModified()))).substring(Long.toString(temp.lastModified()).length()); 

result_filenames.add(modified_20_digits+temp.getAbsoluteFile().toString());

事情是这样的:

Filename1: C:\data\file1.html最近修改:1532914451455最近修改20数字:00000001532914451455

Filename1: C:\data\file2.html最近修改:1532918086822最近修改20数字:00000001532918086822

将文件名转换为:

Filename1: 00000001532914451455 c: \ \ file1.html数据

Filename2: 00000001532918086822 c: \ \ file2.html数据

然后你可以对这个列表进行排序。

你所需要做的就是稍后再次剥离这20个字符(在Java 8中,你可以使用.replaceAll函数用一行来剥离整个数组)

你可以试试番石榴。

Function<File, Long> getLastModified = new Function<File, Long>() {
    public Long apply(File file) {
        return file.lastModified();
    }
};

List<File> orderedFiles = Ordering.natural().onResultOf(getLastModified).
                          sortedCopy(files);

在java 6中,最好的方法是:

  File[] listaArchivos = folder.listFiles();
            Arrays.sort(listaArchivos, new Comparator<File>() {
                @Override
                public int compare(File f1, File f2) {
                    return (f1.lastModified() < f2.lastModified()) ? -1 : ((f1.lastModified() == f2.lastModified()) ? 0 : 1);
                }
            }); 

还有一种完全不同的方法可能更简单,因为我们不处理大数。

在检索到所有文件名和lastModified日期之后,不必对整个数组进行排序,只需在检索到每个文件名之后在列表的正确位置插入它。

你可以这样做:

list.add(1, object1)
list.add(2, object3)
list.add(2, object2)

将object2添加到位置2后,它将把object3移动到位置3。

让数组名称->文件。


Ascending -> Arrays.sort(files, (o1, o2) -> Long.compare(o1.lastModified(), o2.lastModified()));

Descending -> Arrays.sort(files, (o1, o2) -> Long.compare(o2.lastModified(), o1.lastModified()));