我需要按照正確的順序對文件進行排序,就像在默認的Windows資源管理器中一樣。
標準的Java字符串比較器運行良好,直到只有字母值。如果名稱中有任何數字,則表明它的工作原理錯誤,例如:
名稱爲「15 - abc.txt」的文件在列表中位於「2 - abc.txt」之上。
解決多語言情況下這個問題的最佳方法是什麼(應該使用java.text.Collator)?在Java中使用數字名稱對文件進行排序
回答
實現您自己的比較器,根據需要考慮數字。這個比較器可以按組分割文件名:與其他字符分開的數字。
例如15-abc-32b.txt
將產生陣列{"15", "abc", "32", "b"}
。現在比較這樣的數組很簡單。您應該仔細閱讀元素並嘗試使用Integer.pareseInt()
來解析它們。如果解析成功,比較適當的數字,否則比較字符串。
使用Java Comparator並通過按順序分別比較文件名的整數和字符串字段來實現compare()方法。
請注意,java.text.Collator已經實現了Comparator接口。來自[Javadoc](http://docs.oracle.com/javase/7/docs/api/java/text/Collator.html):* Collator類執行區域設置敏感的字符串比較。你使用這個類來建立自然語言文本的搜索和排序例程。* – 2013-04-04 13:52:57
考慮到NumberFormat的解析「15-ABC-32b.txt」爲15(見API),您可以換句話說所以有點像這個
String[] files = new File("dir").list();
Arrays.sort(files, new Comparator<String>() {
NumberFormat f = NumberFormat.getInstance();
public int compare(String f1, String f2) {
try {
return Double.compare(f.parse(f1).longValue(), f.parse(f2).longValue());
} catch (ParseException e) {
throw new IllegalArgumentException(f1 + "|" + f2);
}
}
});
不好的方法。如果我有名爲「abc - (1).txt」的文件不應該起作用。 – SeniorJD 2013-04-04 14:13:01
文件,你不希望它像在Windows資源管理器中工作。 – Keppil 2013-04-04 13:44:52
看起來像你有自己的答案:*應該使用*'java.text.Collator' *。你有沒有試過它? – 2013-04-04 13:45:01
@LuiggiMendoza是的,我有。 – SeniorJD 2013-04-04 14:24:25