我有一个类成员列表,我在以下方法中迭代:
public void deselectAll() {
Iterator<GraphicalObject> iterator = selectedObjects.iterator();
while(iterator.hasNext())
{
iterator.next().setSelected(false);
}
}
方法setSelected()将导致在setSelected()触发器的后续调用中删除当前元素。 有没有办法可以从这个方法中删除当前元素并继续正常迭代?
编辑:我看到问题有点含糊不清。这是在上下文中显示问题的示例(我遗漏了不相关的代码):
public class Model {private List<GraphicalObject> selectedObjects; private final GraphicalObjectListener listener = new GraphicalObjectListener() { @Override public void graphicalObjectSelectionChanged(GraphicalObject go) { int index = selectedObjects.indexOf(go); if(go.isSelected()) { if(index == -1) { selectedObjects.add(go); } else { return; } } else { if(index != -1) { selectedObjects.remove(index); } else { return; } } notifyListeners(); } }; public void deselectAll() { Iterator<GraphicalObject> iterator = selectedObjects.iterator(); while(iterator.hasNext()){ iterator.next().setSelected(false); } }
}
public abstract class AbstractGraphicalObject implements GraphicalObject {
@Override public void setSelected(boolean selected) { this.selected = selected; notifySelectionListeners(); } public void notifySelectionListeners() { for (GraphicalObjectListener listener : listeners) { listener.graphicalObjectSelectionChanged(this); } }
}
答案 0 :(得分:1)
如果你想从列表中删除元素并在删除的元素上调用setSelected(false)
,你可以按如下方式执行:
public void deselectAll() {
Iterator<GraphicalObject> iterator = selectedObjects.iterator();
while(iterator.hasNext()) {
GraphicalObject g = iterator.next();
iterator.remove(); // removes g from selectedObjects
g.setSelected(false); // deselects g
}
}
当然,在您的setSelected
方法中,您不应该从列表中删除该元素。
注意:只要集合remove
支持通过迭代器删除,就可以在迭代器上调用selectedObjects
,但大多数常见集合都是这种情况,例如ArrayList
。< / p>
答案 1 :(得分:1)
您可以迭代列表的副本,这样就不会遇到ConcurrentModificationExceptions。 如果你正在使用Java 8:
public void deselectAll() {
List<GraphicalObject> toBeDeselected = selectedObjects.stream().collect(Collectors.toList());
toBeDeselected.forEach(obj -> obj.setSelected(false));
}