2017-06-08 69 views
2

我有一个类成员列表,我在下面的方法迭代:如何从另一个方法中迭代的列表中删除元素?

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

}如果要同时删除

公共抽象类AbstractGraphicalObject实现GraphicalObject {

@Override public void setSelected(boolean selected) { this.selected = selected; notifySelectionListeners(); } public void notifySelectionListeners() { for (GraphicalObjectListener listener : listeners) { listener.graphicalObjectSelectionChanged(this); } }

}

+0

您能举一个你期望的例子吗?也可能是https://stackoverflow.com/questions/626671/java-how-to-remove-elements-from-a-list-while-iterating-over-adding-to-it?rq=1 – Ishnark

+0

做重复你想迭代旧的列表或删除元素的列表? –

+0

正如我理解的问题,你可以遍历一个'selectedObjects'副本而不是直接迭代它。尽管如此,我发现用问题编写的方式来思考可能的解决方案有点困难。如果你添加了一个很好的[MCVE](https://stackoverflow.com/help/mcve),它会显示出你正在做的事情以及你为什么要求真的有必要。也可能是您遇到的这个问题实际上意味着您应该重新构建程序,而不是试图找到解决方法。 – Radiodef

回答

1

012:从被删除的元素的列表和呼叫 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的情况。

1

你可以遍历列表的副本,这样你就不会遇到ConcurrentModificationExceptions。 如果您使用的是Java 8:

public void deselectAll() { 
    List<GraphicalObject> toBeDeselected = selectedObjects.stream().collect(Collectors.toList()); 
    toBeDeselected.forEach(obj -> obj.setSelected(false)); 
} 
相关问题