删除特定对象在Java ArrayList中不起作用

Pie*_*ard 0 java arraylist

我有一个ArrayList包含对其父对象的引用的对象.

我试图删除特定父对象中的每个对象(所以等于父对象).

如果我做:

System.out.println(parent);
Run Code Online (Sandbox Code Playgroud)

我的控制台输出:

ParentObject@1f8166e5
Run Code Online (Sandbox Code Playgroud)

如果我做:

for(int i = 0; i < array.size(); i++){
   if(array.get(i).getParent().equals(parent)){
      array.remove(i);
   }
}
Run Code Online (Sandbox Code Playgroud)

并且(测试)

for(int i = 0; i < array.size(); i++){
   if(array.get(i).getParent().equals(parent)){
      System.out.println(parent + ":" + array.get(i).getParent());

   }
}
Run Code Online (Sandbox Code Playgroud)

我的控制台输出如下:

ParentObject@1f8166e5:ParentObject@1f8166e5
Run Code Online (Sandbox Code Playgroud)

上面的代码片有什么问题?为什么array.remove(i)不工作?

Jon*_*eet 8

我怀疑问题在于你删除了元素i(它将所有内容移到列表后面 - 索引处的元素n + 1现在有索引n等),然后你跳过下一个元素.因此,如果要删除两个连续元素,则会丢失第二个元素.最简单的解决方法是从最后开始工作:

for (int i = array.size() - 1; i >= 0; i--) {
   if (array.get(i).getParent().equals(parent)) {
      array.remove(i);
   }
}
Run Code Online (Sandbox Code Playgroud)

编辑:如另一个答案所述,无论如何使用迭代器通常更好.在您的情况下,这将是这样的:

// We don't know what the Foo type is...
for (Iterator<Foo> iterator = array.iterator(); iterator.hasNext(); ) {
    Foo element = iterator.next();
    if (element.getParent().equals(parent)) {
        iterator.remove(); // Note: *not* array.remove(...)
    }
}
Run Code Online (Sandbox Code Playgroud)