技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

Listを走査しながら要素を削除する。

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 を使う書き方でいきたいと思う。