2013-05-17 2 views
0

다음 파일 형식이 있습니다 update_0_9_26. 내가 0_9_26보다 큰 버전을 가지고있는 모든 파일을 검사 할 자바 코드를 작성하고 싶다. 예 : 0_9_27 등. 이 계산에서 검색 한 파일에 대한 처리를 수행해야합니다.주어진 파일 이름보다 버전 필드가 큰 파일 이름 확인

Referece 이름보다 큰 파일 이름을 검색하려면 어떻게 파일 이름을 구문 분석해야합니까?

예 입력 :

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. 를 사용합니다.
  3. 사용자 지정 비교기 (아래 참조)를 사용하여 만든 TreeSet에 해당 목록을 정렬합니다.
  4. 집합을 반복하면서 파일을 순서대로 처리하지만 이미 본 파일은 제외합니다. 해당 요소 만 포함하는 세트의보기를 보려면 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); 
     } 
    } 
} 
관련 문제