执行循环体以将添加的元素添加到列表中

时间:2012-08-23 08:11:31

标签: java collections

我想将循环中的元素添加到列表中,以便循环体也将为它们执行。我知道这种技术很常见,以防止ConcurrentModificationException

List<Element> thingsToBeAdd = new ArrayList<Element>();
for(Iterator<Element> it = mElements.iterator(); it.hasNext();) {
    Element element = it.next();
    if(...) {  
         //irrelevant stuff..
        if(element.cFlag){
            // mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY));
            thingsToBeAdd.add(new Element("crack",getResources(), (int)touchX,(int)touchY));
            element.cFlag = false;
       }           
   }
}
mElements.addAll(thingsToBeAdd );

不幸的是,它没有为新元素执行循环。

编辑:

List<Element> thingsToBeAdd = new ArrayList<Element>();
for(Iterator<Element> it = mElements.iterator(); it.hasNext();) {
    Element element = it.next();
    if(...) {  
        //irrelevant stuff..
        if(element.cFlag){
            // mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY));
            thingsToBeAdd.add(new Element("crack",getResources(), (int)touchX,(int)touchY));
            element.cFlag = false;
       }           
   }
   mElements.addAll(thingsToBeAdd );
}

这将导致ConcurrentModificationException

3 个答案:

答案 0 :(得分:0)

不是你在完成循环后在mElements中添加元素

mElements.addAll(thingsToBeAdd );

答案 1 :(得分:0)

答案 2 :(得分:0)

我使用递归实现了我的目标:

private List<Element> executeForEachElement(List<Element> oldList)
    List<Element> newElements = new LinkedList<Element>();
    for (Element elem : oldList {
            newElements.addAll(generateNewElements(elem));
    }
    if (!newElements.isEmpty()) {
        oldList.addAll(executeForEachElement(newElements));
    }

    return oldList;
}