Java で、List を走査しながら要素を削除すると、ConcurrentModificationException が発生することがある。例えば、以下のようなケース。
List<Integer> nums = new ArrayList<>(); nums.add(1); nums.add(2); nums.add(3); nums.add(-1); nums.add(4); nums.add(-2); nums.add(5); for (Integer num : nums) { if (num < 0) { nums.remove(num); } }
なので、これまでは、削除対象を別の List に入れてから、その削除対象の List で for 文を回しながら対応していた。例えば、以下のような感じ。
List<Integer> removeList = new ArrayList<>(); for (Integer num : nums) { if (num < 0) { removeList.add(num); } } for (Integer remove : removeList) { nums.remove(remove); }
ただ、このやり方だと、2回も for 文を回しているし冗長だな~と思って調べてみたら、以下のように Iterator を使うことでやりたいことができるようだ。
Iterator<Integer> iter = nums.iterator(); while (iter.hasNext()) { if (iter.next() < 0) { iter.remove(); break; } }
今後は、この Iterator を使う書き方でいきたいと思う。