删除特定对象在Java ArrayList中不起作用
我有一个对象的ArrayList,其中包含对其父对象的引用 我试图删除特定父对象中的每个对象,使其与父对象相等 如果我这样做:删除特定对象在Java ArrayList中不起作用,java,arraylist,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); }
System.out.println(parent);
我的控制台输出:
ParentObject@1f8166e5
如果我这样做:
for(int i = 0; i < array.size(); i++){
if(array.get(i).getParent().equals(parent)){
array.remove(i);
}
}
上面的片段有什么问题?
为什么array.removei不工作 我怀疑问题在于,在您删除元素I之后,它会将其之后的所有内容上移到列表中-索引n+1处的元素现在有索引n等,然后您会跳过下一个元素。因此,如果要删除两个连续的元素,则缺少第二个元素。最简单的解决方法是从最后开始工作: 编辑:正如另一个答案中所指出的,通常最好使用迭代器进行删除。在您的情况下,这将如下所示:
// 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(...)
}
}
我怀疑问题在于,在删除元素I之后,它会将其之后的所有内容向上移动到列表中-索引n+1处的元素现在有索引n等,然后跳过下一个元素。因此,如果要删除两个连续的元素,则缺少第二个元素。最简单的解决方法是从最后开始工作: 编辑:正如另一个答案中所指出的,通常最好使用迭代器进行删除。在您的情况下,这将如下所示:
// 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(...)
}
}
迭代时不能删除对象。如果要在迭代时删除元素,应该使用迭代器在迭代时不能删除对象。如果要在迭代时删除元素,应使用迭代器什么是删除不起作用的指示?什么是删除不起作用的指示?他使用的不是迭代器,而是索引for循环。删除works,这不是一个好模式,可能会导致@Jon Skeet暗示的问题。我在我的答案中添加了一个基于迭代器的方法。他使用的不是迭代器,而是索引for循环。移除是有效的,这不是一个好模式,可能会像@Jon Skeet所暗示的那样导致问题。我在我的答案中添加了一种基于迭代器的方法。@Pier AlexandreBouchard:不是随机重新分配的随机移动,而是像其他所有东西一样向上移动一个位置-如果你有一个索引为10的元素a,并且你移除了索引为2的元素,元素A现在有索引9。@Pier AlexandreBouchard:不是随机重新分配,而是像其他所有元素一样向上移动一个位置-如果您有一个索引为10的元素A,并且您删除了索引为2的元素,那么元素A现在有索引9。
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(...)
}
}