[英]Sort files in ascending order in Java
我一直在使用这种方法对文件进行升序排序:
File folder = new File("F:/test/");
File files[] = folder.listFiles();
Arrays.sort(files, new Comparator<File>() {
@Override
public int compare(final File o1, final File o2) {
return o1.getName().compareTo(o2.getName());
}
});
for (File f : files) {
System.out.println(f.getName());
}
但是我得到的结果是:
为什么我得到这种结果? 如何根据文件名的数字部分而不是字母顺序以数字升序获得结果?
Java字符串的compareTo函数按字典顺序比较值。 如果这不是您想要的排序算法,则需要为比较器使用其他内容。
根据文件的命名方案,您可能想尝试的一个不错的选择是从字符串的开头提取数字,并将其解析为一个int。 类似于...
String[] parts = o1.split("_");
int lhs = Integer.parseInt(parts[0]);
parts = o2.split("_");
int rhs = Integer.parseInt(parts[0]);
return lhs.compareTo(rhs);
使用compareTo()
比较两个字符串将按字典顺序比较它们,这基于每个字符的值。 例如,这意味着10_
在1_
之前。
您真正想要做的是比较文件名的数字部分:
Arrays.sort(files, new Comparator<File>() {
@Override
public int compare(File f1, File f2) {
String name1 = f1.getName();
String name2 = f2.getName();
Integer num1 = Integer.valueOf(name1.substring(0, name1.indexOf("_")));
Integer num2 = Integer.valueOf(name2.substring(0, name2.indexOf("_")));
return num1.compareTo(num2);
}
});
您将需要一个更好的比较方法来提取数字。 注意:这是一个幼稚的示例,假设您的文件名全部为Number_otherStuff.txt
格式。
public int compare(final File o1, final File o2) {
Integer f1Num = Integer.parseInt(o1.getName().substring(o1.getName().indexOf('_')));
Integer f2Num = Integer.parseInt(o2.getName().substring(o2.getName().indexOf('_')));
return f1Num.compareTo(f2Num);
}
假设在00-2F范围内没有特殊字符:
int max = max_length_of_file_name + Math.log10(max_leading_number);
return leftPadWith0ToMaxLength(o1.getName(), max).compareTo(leftPadWith0ToMaxLength(o2.getName(), max));
剩余练习的leftPadWith0ToMaxLength,max_length_of_file_name,max_leading_number的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.