본문 바로가기

카테고리 없음

[자바,안드로이드] Iterator를 사용하여 ArrayList 요소 삭제하기

ArrayList 사용할 때, 특정 요소 여러개를 삭제하기 위해 반복문 루프 안에서  remove()를 하면 코드가 작동하지 않거나, 에러가 나는 경우가 있습니다. 예를들어 장바구니 목록에서 체크한 상품들만 삭제한다고 할 때, 반복문 안에서 순서대로 ArrayList의 요소의 체크여부를 확인합니다. 그리고 요소가 체크가 되어있을 때 삭제를 해야하는데, 이렇게 지워버릴 경우 다음 요소들의 순번이 하나씩 앞으로 오게됩니다. 그리고 또다시 삭제를 해야할 때 요소들의 순번이 바뀌어있으므로 에러가 납니다. 이런 상황을 막기 위해서 Iterator를 사용해야 합니다.

  • Iterator란? (이터레이터, 반복자)
    - 자바의 컬렉션 프레임워크에서컬렉션 저장된 요소들을 읽어오는 방법을 인터페이스로 표준화 .
public interface Iterator {
    boolean hasNext(); 
    Object next();
    void remove();
}
  • hasNext() : 읽어올 요소가 남아있는지 확인하는 메소드. 요소가 있으면 true, 없으면 false 반환.
  • next() : 다음 요소를 반환.
  • remove() : next() 읽어온 요소를 현재 컬렉션에서 제거
  • 메소드 호출 순서 : hasNext() next() remove()

사용방법

방법1.

ArrayList<Integer> list = new ArrayList<Integer>();
for( Iterator<Integer> itr = list.iterator(); itr.hasNext(); )
{
  list.get( itr.next() );
}

방법2.

ArrayList<Integer> list = new ArrayList<Integer>();
Iterator<Integer> itr = list.iterator();
while( itr.hasNext() )
{
  list.get( itr.next() );
}

 

비슷한 인터페이스들

1. Enumeration<E> 인터페이스

  • JDK 1.0부터 사용.  Iterator 인터페이스와 같은 기능을 하며, 이전 버전과의 호환성을 위해 남아있습니다.
  • Enumeration 대신 Iterator 인터페이스를 사용하는 것을 권장합니다.

2. ListIterator<E> 인터페이스

  • Iterator 인터페이스를 상속받아 기능을 추가한 인터페이스.
  • Iterator 경우 방향으로만 컬렉션의 요소에 접근할 있지만, ListIterator 양방향 이동이 가능한 것이 특징입니다.
  • List 컬렉션 클래스에서만 사용 가능하다는 단점이 있습니다.

ListIterator 인터페이스 메소드