我需要根据文件名中的日期对文件进行排序。我编写了对文件进行排序但未按预期运行的代码。
代码:
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
有人可以帮我吗?
答案 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(…)
。