'的instanceof'不一致

时间:2015-04-30 02:39:40

标签: java javafx

嘿,这里的编程学生。

我有一个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);
    }
 }

这有时很好。其他时候它根本无法删除任何东西。谢谢你的帮助。

4 个答案:

答案 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
    }
 }