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

我有一个对象数组(文件列表)。 如何遍历此数组并删除一些对象(使用Java) – 具体取决于条件?

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

我认为解决问题的最佳Java方法是将数组转换为列表并使用允许删除对象的迭代器:

 List files = new ArrayList(Arrays.asList(file.listFiles())); Iterator iterator = files.iterator(); while(iterator.hasNext()){ File currentFile = iterator.next(); if(someCondition){ iterator.remove(); } // other operations } 

如果需要,您甚至可以将其再次转换为数组 – 即使处理列表可能更方便……:

 File[] filesArray = files.toArray(); 

您可能最好将FilenameFilter提供给listFiles并在那里应用条件。 请参阅文件文档http://download.oracle.com/javase/6/docs/api/java/io/File.html

我们无法删除元素并在一个步骤/操作中调整数组大小 。 数组无法resize。

使用List或(1)标记要删除的元素,以及(2)将要保留的元素写入新数组。

如果你继续使用数组,这是一个解决方案( List更容易):

 private File[] filter(File[] files) { boolean[] deleteFlags = new boolean[files.length]; int deleteCounter = 0; // collection for (int i = 0; i < files.length; i++) { if (deleteConditionIsTrue()) { deleteFlags[i] = true; deleteCounter++; } } // create result File[] result = new File[files.length-deleteCounter]; int gapCounter = 0; for (int i = 0; i < deleteFlags.length; i++) { if (deleteFlags[i]) { gapCounter++; // skip entry, has been filtered/deleted } else { result[i-gapCounter] = files[i]; } } return result; } 

JB Nizet完全正确:

  1. 您不能从数组中“删除”元素

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

  3. 在所有条件相同的情况下,使用List <>可能会更好,它允许您插入和删除元素。

PS:如果您事先知道哪些元素不是您想要的,那么FileFilter理念是一种很好的方法,可以避免它们首先出现。

您需要让数组中的对象索引能够删除它:

 File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { if(someCondition) { files[i] = null; } } 

请注意,数组具有固定长度。 删除元素不会缩小数组。 如果需要,请使用List ,使用Iterator列表,并使用迭代器的remove方法删除当前元素。

我建议将其转换为列表并使用LambdaJfilter操作: http : //code.google.com/p/lambdaj/wiki/LambdajFeatures 。 此外,还可以在其他库中使用过滤列表,例如Guava。