我有一个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)
不起作用?
答案 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