2012-08-30 41 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来使我的代码更具可读性并易于维护。

相关问题