我有一个包含许多条目的大型集合:Set<File> allFiles
。
是否实用使用以下算法迭代此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()方法收集。
答案 0 :(得分:4)
如果实际上你的意思是在java中用5行可写,是的。当您想要过滤列表时,没有更清晰的选择(与具有Scala及其过滤方法等功能构造的语言相反)。
我个人看不出你怎么能做得更好,如果你的用例真的要过滤掉带有错误扩展名的文件,我会用Java做同样的事情。
如果您担心使用javax.swing
中的接口和类,则不应该这两个类仅依赖于java.io
或java.util.Locale
(根据英语语言环境将文件名设置为小写) ),因此它们与来自FilenameFilter
的{{1}}一样干净。如果您的交易真的要根据不区分大小写的扩展进行过滤,那么你肯定应该采用这种方式,我的eclipse看到的唯一替代方法是java.io
实现com.google.gwt.thirdparty.guava.common.io.PatternFilenameFilter
,但是你有一个新的依赖关系并且你写了一个正则表达式与您的扩展程序相比,它的可读性和可维护性要差得多。如果这确实是你的用例,我会留在java.io.FilenameFilter
。
答案 1 :(得分:2)
我不明白这是不切实际的。它不应该比迭代和添加到Lists而不是Set更慢(尽管那仍然会稍微快一点并且使用更少的内存)。但是如果你有充分的理由使用Set(例如你想要独特的元素和/或想要快速查询会员资格),我想你会没事的。
虽然没有查看其余的代码很难说。我建议你自己测试一下。
答案 2 :(得分:0)
与其他人建议的一样,您有适当的方法来过滤该集合。唯一认为我会做的是使用来自apache commons的CollectionUtils.html#filter
来使我的代码更易读和易于维护。