根据文件名中的日期对文件排序

时间:2018-12-13 11:42:26

标签: java sorting

我需要根据文件名中的日期对文件进行排序。我编写了对文件进行排序但未按预期运行的代码。

代码:

import java.io.File;
import java.util.Arrays;
import java.util.Comparator;

public class Sorting {

    public static void displayFiles(File[] files) {
        for (File f : files) {
             System.out.println(f.getName());
        }
    }

    public static void main(String[] args) {

        File folder = new File("C:\\source");
        File[] listOfFiles = folder.listFiles();
        Arrays.sort(listOfFiles, getFileComparator());

        displayFiles(listOfFiles);
    }

     protected static Comparator<File> getFileComparator() {
        Comparator<File> fileComparator = new Comparator<File>() {
            @Override
            public int compare(File o1, File o2) {
                String o1Date = o1.getName().substring(o1.getName().lastIndexOf("_"));
                String o2Date = o2.getName().substring(o2.getName().lastIndexOf("_"));
                return o1Date.compareTo(o2Date);
            }
        };

        return fileComparator;
    }
}

我的文件是:

abc_2018_11_30.dat
abc_2018_11_30-0002.dat
file_2015_09_28.dat
hi_2015_09_28.dat
xxx_2015_09_28.dat
xyz_ca_2015_09_28.dat

我需要输出为:

file_2015_09_28.dat
hi_2015_09_28.dat
xxx_2015_09_28.dat
xyz_ca_2015_09_28.dat
abc_2018_11_30.dat
abc_2018_11_30-0002.dat

带有-001,-002 ...的文件应排在实际文件之后。但是我的代码给出的输出为:

file_2015_09_28.dat
hi_2015_09_28.dat
xxx_2015_09_28.dat
xyz_ca_2015_09_28.dat
abc_2018_11_30-0002.dat
abc_2018_11_30.dat

有人可以帮我吗?

3 个答案:

答案 0 :(得分:2)

值得。使用正则表达式提取要比较的部分,然后仅比较该部分。您的订单无效,因为“。”在“ _”之前。

static Pattern pattern=Pattern.compile(".*_([0-9_]{10}.*)\\..*");

public static String extractDate(String in)
{
    Matcher m=pattern.matcher(in);
    if(m.matches())
        return m.group(1);
    return in;
}

在比较器中:

return extractDate(o1.getName()).compareTo(extractDate(o2.getName());

答案 1 :(得分:1)

只需替换下面的行:

return o1Date.compareTo(o2Date);

return o1Date.replace("-", "_").compareTo(o2Date.replace("-", "_"));

但是,这只会按日期而不是按日期对文件进行排序。更准确的方法是使用正则表达式提取日期并执行比较。下面是代码:

    Pattern pattern=Pattern.compile(".*_([0-9_]{10}.*)\\..*");
    public static String extractDate(String in)
     {
         Matcher m=pattern.matcher(in);
         if(m.matches())
            return m.group(1);

         return in;
     }

,返回语句将为:

return extractDate(o1.getName()).compareTo(extractDate(o2.getName());

答案 2 :(得分:0)

我会做的:

为文件设计一个类。包括对File的引用,日期作为LocalDate和序列号。实施Comparable,先比较日期,再比较序列号。

为每个文件构造一个对象。使用正则表达式来取出日期和序列号。解析日期和数字。如果文件名中没有序列号,请将序列号设置为-1。

排序对象。从排序结果中取出文件。

如果您不喜欢该类,并且性能不是很关键,那么可以不用类而用更少的代码行来完成,并且可以使用不错的Comparator.comparing(…)