Java:如何根据条件从数组中删除对象?

时间:2011-07-11 07:16:04

标签: java iteration

我有一个对象数组(完全是文件列表)。如何迭代这个数组并删除一些对象(在Java中) - 取决于条件?

File[] files = file.listFiles();
for(File f: files) {
   if(someCondition) {
       // remove
   }
}

6 个答案:

答案 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完全正确:

  1. 您无法从数组中“删除”元素

  2. 可以将元素设置为“null”。这有效地删除它们(以C类方式),但它需要额外的逻辑,因此您不会意外地尝试引用null元素。

  3. 在所有条件相同的情况下,您最好使用List&lt;&gt ;, 允许您插入和删除元素。

  4. PS: 如果你事先知道你不想要的元素,FileFilter的想法是一个很好的方法,可以避免它们被放在首位。

答案 5 :(得分:1)

我建议将其转换为list并使用LambdaJ过滤器操作: http://code.google.com/p/lambdaj/wiki/LambdajFeatures。此外,其他库中也提供了列表过滤器,例如Guava。