嘿,这里的编程学生。
我有一个JavaFX应用程序。我有一个窗格,我想从中删除所有矩形。这是代码:
public Pane yard = new Pane();
...
for(int i = 0; i < yard.getChildren().size(); i++)
{
if(yard.getChildren().get(i) instanceof Rectangle)
{
yard.getChildren().remove(i);
}
}
这有时很好。其他时候它根本无法删除任何东西。谢谢你的帮助。
答案 0 :(得分:8)
当你向前推进索引时,你正在删除项目,导致你不考虑删除某些项目。
您应该使用Iterator
来解决此问题:
Iterator<?> it = yard.getChildren().iterator();
while(it.hasNext()) {
if(it.next() instanceof Rectangle) {
it.remove();
}
}
如果你使用的是Java 8,那么你可以这样做,而且更具可读性:
yard.getChildren().removeIf(Rectangle.class::isInstance);
答案 1 :(得分:4)
这是因为您在for循环中调用了remove。你不能这样做。如果你的for循环以10个条目开头,那么第6个位置的项目可能是一个以矩形开头的项目。但是,如果您删除列表中的第5个条目,则位置6处的位置将位于第5位并被跳过。
示例:
yard.getChildren[0] = square
yard.getChildren[1] = square
yard.getChildren[2] = rectangle
yard.getChildren[3] = rectangle.
你可以看到索引2处的项目将被删除,这意味着yard.getChildren的大小现在是3.你的计数器我此时也将是3。因此for循环将停止,最后一个矩形不会被删除。
答案 2 :(得分:2)
这种情况正在发生,因为您正在循环中从列表中删除项目。 如果你需要删除循环中的项目,你应该使用迭代器,请参阅: Calling remove in foreach loop in Java
答案 3 :(得分:1)
当您从集合中删除项目时,集合中的项目数量也会减少。因此,您必须预测它并减少工作指数以反映这种变化:
public Pane yard = new Pane();
...
for(int i = 0; i < yard.getChildren().size(); i++)
{
if(yard.getChildren().get(i) instanceof Rectangle)
{
yard.getChildren().remove(i--);// i-- is the change
}
}