我試圖實現一個相當簡單的方法,在該方法中我想篩選一個列表。這是一個File對象的列表,應該只有一個以.asp結尾的文件 - 我希望那個從列表中排除。請記住,我實際上並不想將這個文件從列表中刪除,我只是希望能夠忽略該列表的特定迭代。如何從列表中篩選元素
我原來的(暴力)的實現是這樣的:
public List<File> getSurveyFiles() throws Exception {
List<File> surveyFiles = new ArrayList<File>(files.size() - 1);
for (File f : files) {
if (!f.getName().endsWith(".asp")) {
surveyFiles.add(f);
}
}
return surveyFiles;
}
它的工作原理,但它在我創建第二個列表,並做了很多複製從一個列表這樣的事實感到非常浪費另一個。
我和玩弄另一種選擇是使用番石榴庫(http://code.google.com/p/guava-libraries/),並利用它們的過濾功能,如:
public class SurveyFileControllerPredicate implements Predicate<File> {
@Override
public boolean apply(File file) {
return file.getName().endsWith(".asp");
}
}
...
public Iterable<File> getSurveyFiles() throws Exception {
return Iterables.filter(
files,
Predicates.not(new SurveyFileControllerPredicate())
);
}
過濾器的實現會在迭代時刪除.asp文件,而不是提前,因此此代碼具有不創建第二個List的好處,但我覺得它使我的代碼更加複雜。
我還沒有考慮其他更簡單的實現嗎?
在事物的整個方案中,我選擇的實現可能並不重要。我只是好奇其他開發者如何解決這個問題,他們會選擇什麼樣的選擇。
謝謝。
你迭代的情況下,其中[的FilenameFilter(http://docs.oracle.com/javase/6/docs/api/java/io/FilenameFilter.html)是合適的,雖然這些文件? –
當您填充原始列表本身時,是否可以添加過濾器?我的意思是,原始列表人口是通過您的代碼完成的,還是您收到預先填充的代碼? –