我有一个对象数组(完全是文件列表)。如何迭代这个数组并删除一些对象(在Java中) - 取决于条件?
File[] files = file.listFiles();
for(File f: files) {
if(someCondition) {
// remove
}
}
答案 0 :(得分:23)
我认为解决问题的最佳Java方法是将数组转换为列表并使用允许删除对象的迭代器:
List<File> files = new ArrayList<File>(Arrays.asList(file.listFiles()));
Iterator<File> iterator = files.iterator();
while(iterator.hasNext()){
File currentFile = iterator.next();
if(someCondition){
iterator.remove();
}
// other operations
}
如果需要,您甚至可以将其再次转换为数组 - 尽管处理列表可能更方便......:
File[] filesArray = files.toArray();
答案 1 :(得分:3)
您可能最好将FilenameFilter提供给listFiles
并在那里应用条件。请参阅文件文档http://download.oracle.com/javase/6/docs/api/java/io/File.html
答案 2 :(得分:3)
我们无法在一步/操作中删除元素并调整大小数组。数组无法调整大小。
使用List
或(1)标记要删除的元素,以及(2)将要保留的元素写入新数组。
如果您希望继续使用数组(<{1}}更容易),这是一个解决方案:
List
答案 3 :(得分:1)
您需要让数组中的对象索引能够将其删除:
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if(someCondition) {
files[i] = null;
}
}
请注意,数组具有固定长度。删除元素不会缩小数组。如果需要,请使用List<File>
,使用Iterator
遍历列表,并使用迭代器的remove
方法删除当前元素。
答案 4 :(得分:1)
JB Nizet完全正确:
您无法从数组中“删除”元素
您可以将元素设置为“null”。这有效地删除它们(以C类方式),但它需要额外的逻辑,因此您不会意外地尝试引用null元素。
在所有条件相同的情况下,您最好使用List&lt;&gt ;, 允许您插入和删除元素。
PS: 如果你事先知道你不想要的元素,FileFilter的想法是一个很好的方法,可以避免它们被放在首位。
答案 5 :(得分:1)
我建议将其转换为list并使用LambdaJ过滤器操作: http://code.google.com/p/lambdaj/wiki/LambdajFeatures。此外,其他库中也提供了列表过滤器,例如Guava。