Java/java

java :) collection framework의 순환 Iterator와 ListIterator

euncheol kim 2022. 5. 16. 20:35

goal

java의 interface Iteratorinterface ListIterator를 이해한다.



1. java의 interface Iterator


java의 Iterator 인터페이스collection framework의 요소들을 읽어오는 방법중 하나이다.

  • Iterator 인터페이스는 컬렉션의 요소에 접근할 때 한 방향으로만 이동할 수 있다.

 

public interface Iterator<E>{
    boolean hasNext();
    E next();
    default void remove(){ throw new UnsupportedOperationException("remove"); };
    default void forEachRemaining(Consumer<? super E> action) {
            Objects.requireNonNull(action);
            while (hasNext())
                action.accept(next());
    }
}

 

Iterator 인터페이스의 method들은 컬렉션의 사용방법에 따라 오버라이딩되나 공통 사용법은 아래와 같다.

메소드 설명
boolean hasNext() 해당 iteration이 다음 요소를 가지고 있으면 true반환, 없으면 false반환
- 반복문에 사용된다.
E next() iteration의 다음 요소를 반환함
default void remove() 해당 반복자로 반환되는 마지막 요소를 현재 컬렉션에서 제거함. (선택적 기능)



[1] HashMap Collection + iterator 실습하기


  • HashMap + Iterator 인터페이스 [실습하기]
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;


public class Note {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("one", "하나");
        map.put("two", "둘");
        map.put("three", "셋");
        map.put("four", "넷");
        map.put("five", "다섯");

        Set<String> keys = map.keySet();
        Iterator<String> iter = keys.iterator();
        while(iter.hasNext()) {
            String key = iter.next();
            System.out.println(key);
        }
    }
}
  • 출력값

image

※ Set은 순서가 없음을 반드시 상기한다.

 

 

 

2. java의 interface ListIterator


java의 Iterator 인터페이스를 상속하여 만들어진 ListIterator 인터페이스

  • ListIterator 인터페이스는 컬렉션 요소의 대체, 추가 그리고 인덱스 검색 등을 위한 작업에서 양방향으로 이동하는 것을 지원한다.
  • 단, ListIterator 인터페이스List 인터페이스를 구현한 List 컬렉션 클래스에서만 listIterator() 메소드를 통해 사용할 수 있다.

[1] interface ListIterator 메소드 정리


메소드 설명
void add(E e) 해당 리스트(list)에 전달된 요소를 추가한다.
boolean hasNext() 이 리스트 반복자가 해당 리스트를 순방향으로 순회할 때
다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고
있지 않으면 flase를 반환한다.
boolean hasPrevious() hasNext()와 역인 관계
E next() 리스트의 다음 요소를 반환하고,
커서(cursor)의 위치를 순 반향으로 이동시킨다.
int nextIndex() 다음 next()메소드를 호출하면 반환될 요소의 인덱스를 반환한다.
E previous() 리스트의 이전 요소를 반환하고, 커서(cursor)의 위치를 역방향으로 이동시킴
int previousIndex() 다음 prevoious()메소드를 호출하면 반환될 요소의 인덱스를 반환한다.
void remove() next()나 previous()메소드에 의해 반환된 가장 마지막 요소를 리스트에서 제거
(선택적 기능)
void set(E e) next()나 previous() 메소드에 의해 반환된 가장 마지막 요소를 전달된
객체로 대체함. (선택적 기능)

 

[2] LinkedList + ListIterator 실습하기


  • LinkedList + iterator 실습
import java.util.LinkedList;
import java.util.ListIterator;

public class Note {
    public static void main(String[] args) {
        LinkedList<Integer> lnList = new LinkedList<Integer>();
        lnList.add(19);
        lnList.add(4);
        lnList.add(15);
        lnList.add(18);

        ListIterator<Integer> iter = lnList.listIterator();
        while(iter.hasNext()){
            System.out.println(iter.next() + " ");
        }
        System.out.println();

        while(iter.hasPrevious()){
            System.out.println(iter.previous() + " ");
        }

    }

}
  • 출력값

image