Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除特定对象在Java ArrayList中不起作用_Java_Arraylist - Fatal编程技术网

删除特定对象在Java 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); }

我有一个对象的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);
   }
}
上面的片段有什么问题?
为什么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(...)
    }
}