Tag Archives: Iterator

[Java] 리스트 순환중에 특정 객체 삭제하기

List<String> list = new ArrayList<String>();

list.add("AAAA");
list.add("BBBB");
list.add("CCCC");
list.add("DDDD");
list.add("EEEE");
list.add("FFFF");
list.add("GGGG");

for(String value : list) {
  if(value.startsWith("D")) {
    list.remove(value);
  }
}

System.out.println("Result: " + list);

위와 같은 소스코드가 있다고 가정을 해보겠습니다. 위의 코드는 단순히 리스트 전체를 순환중에  값이 D로  시작하는 경우 그 객체(현재 순환중인 자기자신)를 삭제하고자 하는 의도를 가지고 있는 코드입니다.

하지만 위의 코드는 다음과 같은 오류를 만나게 됩니다.

Exception in thread "main" java.util.ConcurrentModificationException
  at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
  at java.util.AbstractList$Itr.next(Unknown Source)
  at RemoveInLoop.main(RemoveInLoop.java:20)

기본적으로 리스트는 순환중에 리스트의 추가, 삭제, 변경등 자기 자신을 수정할 수 없게 되어있습니다. 하지만 다음과 같이 Iterator를 활용하면 가능합니다.

List<String> list = new ArrayList<String>();

list.add("AAAA");
list.add("BBBB");
list.add("CCCC");
list.add("DDDD");
list.add("EEEE");
list.add("FFFF");
list.add("GGGG");

for(Iterator<String> it = list.iterator() ; it.hasNext() ; ) {
  String value = it.next();
  if(value.startsWith("C")) {
    it.remove();
  }
}

System.out.println("Result: " + list);

이번에는 C로 시작하는 값을 지워보려는 목적으로 가지고 실행을 해보았습니다. 오류 없이 다음과 같은 결과를 보여줍니다.

Result: [AAAA, BBBB, DDDD, EEEE, FFFF, GGGG]

[RemoveLoop 예제코드 다운로드]