1

次のコードが ConcurrentModificationException をスローするのはなぜですか? Josh Bloch は ConcurrentModificationException を回避できます。

ArrayList<Integer> list=new ArrayList<Integer>();
list.add(100);
list.add(200);
list.add(300);
list.add(400);
for(Integer field : list) {    
    list.remove(field);
    list.add(200);
}       
4

3 に答える 3

0

使用している ArrayList からオブジェクトを削除できます。これをゲームエンジンで使用していますが、動作します。

http://code.google.com/p/game-engine-for-java/source/browse/src/com/gej/map/Map.java#350を参照してください。

for (int i = 0; i < objects.size(); i++) {
    GObject other = objects.get(i);
    if (other.isAlive()) {
        // Update it
    } else {
        // Else remove it
        objects.remove(i);
    }
}

あなたが抱えているエラーは、これがfor eachループでは機能しないということです。通常のforループで試してみると、問題が解決するはずです。

コードをこれに変更します。

ArrayList<Integer> list =new ArrayList<Integer>();
ArrayList<Integer> remove = new ArrayList<Integer>();
list.add(100);
list.add(200);
list.add(300);
list.add(400);
// Mark to remove
for (int i=0; i<list.size(); i++){
    remove.add(list.get(i));
}
list.removeAll(remove);
remove.clear();
// adding 200 at the end because if added in the loop,
// it removes the 200 and adds every loop which causes
// unnecessary memory usage.
list.add(200);
于 2012-10-09T05:23:07.073 に答える