2012-08-30 44 views
1

我有很多條目的大集合:Set<File> allFiles我可以使用FileNameExtensionFilter過濾出文件列表嗎?

是否使用以下算法迭代通過該Set實用?有沒有更好的方法來做到這一點?

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 Set是別處預填充,以及使用該File.listFiles()方法不一定得出。

回答

4

如果通過實際操作,你的意思是在java中可以寫5行是的。當你想過濾一個列表時(與具有像Scala及其過濾器方法這樣的功能性結構的語言相反),沒有更清晰的替代方法。

我personaly看不出你怎麼做得更好,如果你的用例真的是過濾掉具有不良擴展名的文件,我會在Java中做同樣的事情。

如果你擔心使用接口和類從javax.swing你不應該,這兩個類只在java.iojava.util.Locale依賴(設置文件名按英文語言環境爲小寫),所以他們爲FilenameFilter從清潔java.io。如果你的交易真的是按照不區分大小寫的擴展名進行過濾,那麼你一定要這樣做,我的日蝕看到的唯一選擇是com.google.gwt.thirdparty.guava.common.io.PatternFilenameFilter實現java.io.FilenameFilter,但是然後你有一個新的依賴關係,並且你寫了一個可讀性和可維護性較低的正則表達式模式比你的擴展。所以如果這真的是你的用例,我會留下FileNameExtensionFilter

+1

我的問題真的出現不同於'FileNameExtensionFilter'類擴展'javax.swing.FileFilter'的事實,並沒有實現*'FilenameFilter' *,這聽起來更正確的* * – Redandwhite

+0

我編輯關於您的評論 – jolivier

+0

我的回答謝謝!有+1 – Redandwhite

2

我不明白這是不切實際的。它不會明顯慢於迭代並添加到列表而不是集合(儘管這仍然會稍微快一點並使用更少的內存)。但是,如果您有充分的理由使用套餐(例如,您想要獨特的元素和/或想要快速查詢會員資格),我認爲您會沒事的。

雖然不看代碼的其餘部分很難說。我建議你自己測試一下。

0

像其他人一樣建議,您有適當的方法來過濾集合。我唯一能想到的就是使用Apache公用程序中的CollectionUtils.html#filter來使我的代碼更具可讀性並易於維護。

相關問題