0

ループ本体がそれらに対しても実行されるように、ループ内の要素をリストに追加したいと思います。この手法は、次のことを防ぐために非常に一般的であることを知っています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ます。

4

3 に答える 3

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;
}
于 2012-08-23T09:00:30.040 に答える
0

mElementsループの完了後に要素を追加していませんか

mElements.addAll(thingsToBeAdd );
于 2012-08-23T08:15:34.853 に答える
0

を試しましたCopyOnWriteArrayListか?

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/CopyOnWriteArrayList.html

于 2012-08-23T08:28:37.093 に答える