リストでfor文をまわしてリストの要素を削除したいとき、例えば
List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e") for(String value : list){ if(value.equals("b")) list.remove(value); }
このような実装をすると、
java.util.ConcurrentModificationException
で怒られてしまいます。
いまfor文で見てる最中なんだから変更するなよ、ということです。
このようなときは
List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("e") for(int i = list.size() - 1; i >= 0; i--){ if(list.get(i).equals("b")) list.remove(i); }
というようにリストの後ろから見ていくとうまくいきます。”b”を削除して”c”のインデックスが変わっても、”c”はすでに見終わっているので影響がないからです。