'instanceof' 不一致
'instanceof' being inconsistent
你好这里是编程学生。
我有一个 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);
}
}
有时这很好用。其他时候它根本无法删除任何东西。感谢您的帮助。
这是因为您在 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。此时您的计数器 i 也将为 3。因此 for 循环将停止,最后一个矩形将不会被删除。
当您从集合中删除项目时,集合中的项目数量也会减少。所以,你必须预料到它并降低工作指数以反映这种变化:
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
}
}
发生这种情况是因为您在循环中从列表中删除项目。
如果您需要在循环中删除项目,您应该使用迭代器,请参阅:
Calling remove in foreach loop in Java
随着索引的推进,您正在删除项目,导致您不考虑删除某些项目。
您应该使用 Iterator
来解决这个问题:
Iterator<?> it = yard.getChildren().iterator();
while(it.hasNext()) {
if(it.next() instanceof Rectangle) {
it.remove();
}
}
如果您使用的是 Java 8,您可以改为这样做,这样可读性更好:
yard.getChildren().removeIf(Rectangle.class::isInstance);
你好这里是编程学生。
我有一个 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);
}
}
有时这很好用。其他时候它根本无法删除任何东西。感谢您的帮助。
这是因为您在 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。此时您的计数器 i 也将为 3。因此 for 循环将停止,最后一个矩形将不会被删除。
当您从集合中删除项目时,集合中的项目数量也会减少。所以,你必须预料到它并降低工作指数以反映这种变化:
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
}
}
发生这种情况是因为您在循环中从列表中删除项目。 如果您需要在循环中删除项目,您应该使用迭代器,请参阅: Calling remove in foreach loop in Java
随着索引的推进,您正在删除项目,导致您不考虑删除某些项目。
您应该使用 Iterator
来解决这个问题:
Iterator<?> it = yard.getChildren().iterator();
while(it.hasNext()) {
if(it.next() instanceof Rectangle) {
it.remove();
}
}
如果您使用的是 Java 8,您可以改为这样做,这样可读性更好:
yard.getChildren().removeIf(Rectangle.class::isInstance);