2017-06-08 108 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)); 
} 
相關問題