2012-08-30 3 views
1

많은 항목이있는 큰 모음이 있습니다 : Set<File> allFiles.FileNameExtensionFilter를 사용하여 파일 목록을 필터링 할 수 있습니까?

다음 알고리즘을 사용하여이 집합을 반복하는 것이 실제적인입니까? 더 좋은 방법이 있습니까? 경우 사람이 요구하고

Set<File> allFiles = // ...100,000+ entries 
Set<File> filteredList = new LinkedHashSet<File>(); 

FileNameExtensionFilter filter = new FileNameExtensionFilter("Extensions accepted", "a", "b", "c"); 

for (File file : allFiles) { 
    if (filter.accept(file)) { 
     filteredList.add(file); 
    } 
} 

allFiles 설정은 다른 사전이 채워, 그리고 반드시() 메소드 File.listFiles를 사용하여 수집합니다.

답변

4

실용적인면에서 자바에서 5 행으로 쓰기가 가능하다면 그렇습니다. 목록을 필터링 할 때 (스칼라와 필터 메소드와 같은 기능적 구조가있는 언어와 달리) 목록을 정리할 때 더 깨끗한 대안이 없습니다.

나는 당신이 그것을 더 잘할 수있는 방법을 모르겠다. 유스 케이스가 실제로 자바에서 똑같은 일을 할 수있는 나쁜 확장자를 갖는 파일을 걸러내는 것이라면.

당신은 당신이 안 javax.swing에서 인터페이스와 클래스를 사용하는 것이 걱정,이 두 클래스 (영어 로케일에 따라 소문자로 파일 이름을 설정) java.io 또는 java.util.Locale에만 의존하므로이 FilenameFilter에서 한 깨끗 경우 java.io. 거래가 실제로 대소 문자를 구분하지 않는 확장자에 따라 필터링하는 것이 확실한 경우이 방법을 사용하면 com.google.gwt.thirdparty.guava.common.io.PatternFilenameFilterjava.io.FilenameFilter을 구현하는 유일한 대안이지만 새로운 종속성이 있으며 훨씬 읽기 쉽고 유지 관리가 쉬운 정규식 패턴을 작성합니다 확장 프로그램보다 이것이 실제로 당신의 유스 케이스라면 나는 FileNameExtensionFilter으로 머무를 것입니다.

+1

내 질문은 정말'FileNameExtensionFilter' 클래스는'javax.swing.FileFilter'를 확장한다는 사실에서 발생하고 소리 *'FilenameFilter' *를 구현하지 않습니다 더 * 정확한 나는 당신의 의견 – Redandwhite

+0

감사! +1해라. – jolivier

+0

에 대한 내 대답을 편집 * – Redandwhite

2

실용적이지는 않습니다. set을 사용하지 않고 List를 반복하는 것보다 느리게해서는 안됩니다 (그래도 여전히 약간 빠르며 메모리를 적게 사용합니다). 그러나 Set를 사용해야하는 좋은 이유가 있다면 (예 : 고유 한 요소를 원하거나 빠른 멤버십 쿼리를 원한다면) 나는 괜찮을 것이라고 생각합니다.

코드의 나머지 부분을 보지 않고 말하기는 어렵지만. 나는 너 자신을 시험해 볼 것을 제안 할 것이다.

0

다른 사람들이 제안한 것과 마찬가지로, 필터를 적용 할 적절한 방법이 있습니다. 유일한 방법은 아파치 공유지에서 CollectionUtils.html#filter을 사용하여 코드를 읽기 쉽고 유지하기 쉽도록 만드는 것입니다.

관련 문제