데이터를 ArrayList에 담아서 작업 도중 유효성 검사 등을 통해서 조건에 맞지 않는것을 삭제하려고 합니다. 루프(loop)를 돌면서 유효성을 체크해서 삭제를 하는데, 일반적인 for 루프를 사용하면 예외가 발생하거나 원하는 결과를 얻지 못할 수 있습니다.
삭제를 해버리면 내부적으로 루핑을 돌기 위해 사용하는 list의 크기와 처리해야할 항목을 가리키는 인덱스의 불일치 때문에 에러 또는 논리적인 오류가 발생합니다.
Listlist = new ArrayList (); list.add("apple"); list.add("banana"); list.add("melon"); for(String str : list) { if("melon".equals(str)) { list.remove(str); } } System.out.println(list); 결과) Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859) at java.util.ArrayList$Itr.next(ArrayList.java:831)
이것을 해결하는 방법으로는 index 를 사용하는 for 루프를 사용해서 없어진 많큼 사이즈와 인덱스를 직접 조정할 수 있습니다.
int size = list.size();
for(int i = 0; i < size; i++) {
String str = list.get(i);
if("melon".equals(str)) {
list.remove(str);
size--;
i--;
}
}
이것보다 우아한 방법은 Iterator를 사용하는 것입니다.
Listlist = new ArrayList (); list.add("apple"); list.add("banana"); list.add("melon"); Iterator iter = list.iterator(); while(iter.hasNext()) { if("melon".equals(iter.next())) { iter.remove(); } } System.out.println(list); 결과) [apple, banana]
루프 도중에 아이템을 오류없이 삭제하는 방법에 대해서 알아 보았습니다.
반응형
'프로그래밍 > 자바' 카테고리의 다른 글
Tomcat 필터 맵핑 제외하기 - Url Rewrite Filter 이용 (2) | 2018.04.17 |
---|---|
이클립스 local histroy 사용법 및 저장위치 (2) | 2018.04.17 |
Stack Trace 바로 확인할 수 있는 개발용 에러 페이지 만들기 (0) | 2018.04.17 |
Maven 저장소와 의존성 관리 (6) | 2018.04.17 |
Spring Tool Suite에서 Organize Imports 단축키 Ctrl+Shift+O가 동작 하지 않을 때 (2) | 2018.04.17 |