2013-05-17 50 views
0

我有一個格式爲update_0_9_26的文件。我想編寫java代碼,它將檢查版本大於0_9_26的所有文件。例如0_9_27等等。我必須對從此計算中檢索的文件執行處理。檢查版本字段大於給定文件名的文件名

我應該如何解析文件名以檢索那些大於引用名稱的文件名?

示例輸入:

update_0_9_26.sql 
update_0_9_27.sql 
update_0_9_28.sql 
update_1_0_0.sql 
update_1_0_1.sql 
update_1_0_2.sql 

預期輸出(搜索 「大於update_0_9_26」 時):

update_0_9_27.sql 
update_0_9_28.sql 
+0

我看不出有任何問題出現。 – SJuan76

+0

@ Sjuan76我編輯了我的問題。 – MindBrain

+1

編輯試圖讓問題更加突出。如果過度編輯請評論。 – tucuxi

回答

0

簡單的一步一步的指導:

  1. 獲取來自文件系統的文件名,使用new File("myDirName").list()
  2. 將該列表排序到使用自定義比較器創建的TreeSet中(請參見下文)。
  3. 遍歷整個集合,按順序處理文件,但不包括已經看過的文件。使用myTreeSet.tailSet(lastFileToNotProcess, 'true')可以查看僅包含這些元素的集合。

有趣的部分是在步驟2中這是一個自定義的比較器,其其標記化輸入和比較整數令牌數值,和非整數的字母順序標記:

class TokenizingComparator implements Comparator<String> { 
    private String separator; 
    private static Pattern intPattern = Pattern.compile("[0-9]+"); 
    public TokenizingComparator(String separator) { this.separator = separator; } 
    public int compare(String a, String b) { 
     String pa[] = a.split(separator); 
     String pb[] = b.split(separator); 
     for (int ia=0, ib=0; ia<pa.length && ib<pb.length; ia++,ib++) { 
      int rc = comparePart(pa[ia], pb[ib]); 
      if (rc != 0) return rc; 
     } 
     return (pa.length != pb.length) ? 
     pa.length - pb.length : 0; 
    } 
    private comparePart(String a, String b) { 
     if (intPattern.matcher(a).matches() && intPattern.matcher(b).matches()) { 
     return Integer.parseInt(a) - Integer.parseInt(b); 
     } else { 
     return a.compareTo(b); 
     } 
    } 
} 
相關問題