我一直在使用此方法按升序对文件进行排序:
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());
}
但我得到的 结果 是:
为什么我会得到这样的结果?如何根据文件名的数字部分而不是按字母顺序排列的顺序,以数字递增的顺序获得结果?
答案 0 :(得分:2)
Java字符串的compareTo函数比较Lexicographically的值。如果这不是您想要的排序算法,则需要为比较器使用其他东西。
根据文件的命名方案,您可能想要尝试的一个好选择是从字符串的开头提取数字,并将其解析为int。有些东西......
String[] parts = o1.split("_");
int lhs = Integer.parseInt(parts[0]);
parts = o2.split("_");
int rhs = Integer.parseInt(parts[0]);
return lhs.compareTo(rhs);
答案 1 :(得分:2)
使用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);
}
});
答案 2 :(得分:1)
您需要一个更好的比较方法来提取数字。注意:这是一个简单的例子,假设您的文件名都采用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);
}
答案 3 :(得分:0)
假设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的代码留作练习。