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

时间:2014-01-30 21:29:26

标签: java arraylist

我有一个ArrayList的对象,其中包含对其父对象的引用。

我正在尝试删除特定父级中的每个对象(因此等于父对象)。

如果我这样做:

System.out.println(parent);

我的控制台输出:

ParentObject@1f8166e5

如果我这样做:

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

和(测试)

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

   }
}

我的控制台输出类似于:

ParentObject@1f8166e5:ParentObject@1f8166e5

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

2 个答案:

答案 0 :(得分:8)

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

for (int i = array.size() - 1; i >= 0; i--) {
   if (array.get(i).getParent().equals(parent)) {
      array.remove(i);
   }
}
编辑:如另一个答案中所述,无论如何使用迭代器进行删除通常会更好。在您的情况下,这将是这样的:

// 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(...)
    }
}

答案 1 :(得分:1)

迭代时无法删除对象。如果要在迭代时删除元素,则应使用Iterator