如何从另一个方法中迭代的列表中删除元素?

时间:2017-06-08 18:07:30

标签: java list

我有一个类成员列表,我在以下方法中迭代:

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); } }

}

2 个答案:

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