2013-04-04 101 views
0

我需要按照正確的順序對文件進行排序,就像在默認的Windows資源管理器中一樣。
標準的Java字符串比較器運行良好,直到只有字母值。如果名稱中有任何數字,則表明它的工作原理錯誤,例如:
名稱爲「15 - abc.txt」的文件在列表中位於「2 - abc.txt」之上。
解決多語言情況下這個問題的最佳方法是什麼(應該使用java.text.Collat​​or)?在Java中使用數字名稱對文件進行排序

+1

文件,你不希望它像在Windows資源管理器中工作。 – Keppil 2013-04-04 13:44:52

+2

看起來像你有自己的答案:*應該使用*'java.text.Collat​​or' *。你有沒有試過它? – 2013-04-04 13:45:01

+0

@LuiggiMendoza是的,我有。 – SeniorJD 2013-04-04 14:24:25

回答

3

實現您自己的比較器,根據需要考慮數字。這個比較器可以按組分割文件名:與其他字符分開的數字。

例如15-abc-32b.txt將產生陣列{"15", "abc", "32", "b"}。現在比較這樣的數組很簡單。您應該仔細閱讀元素並嘗試使用Integer.pareseInt()來解析它們。如果解析成功,比較適當的數字,否則比較字符串。

1

使用Java Comparator並通過按順序分別比較文件名的整數和字符串字段來實現compare()方法。

+0

請注意,java.text.Collat​​or已經實現了Comparator接口。來自[Javadoc](http://docs.oracle.com/javase/7/docs/api/java/text/Collat​​or.html):* Collat​​or類執行區域設置敏感的字符串比較。你使用這個類來建立自然語言文本的搜索和排序例程。* – 2013-04-04 13:52:57

1

考慮到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); 
      } 
     } 
    }); 
+0

不好的方法。如果我有名爲「abc - (1).txt」的文件不應該起作用。 – SeniorJD 2013-04-04 14:13:01