[英]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.