我有一个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)不工作?
我怀疑问题在于你删除了元素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)
| 归档时间: |
|
| 查看次数: |
472 次 |
| 最近记录: |