Language/Java

[Java] Collection에 저장된 요소 출력하기 (Iterator, ListIterator)

Chef.Yeon 2023. 3. 7. 22:59

Iterator

컬렉션 클래스에 대해 iterator()를 호출하여 Iterator를 얻은 후 , Iterator인터페이스의 메서드를 사용하여 컬렉션의 요소를 읽어올 수 있습니다.

사용 가능한 메서드는 다음과 같습니다.

메서드 설명
boolean hasNext() 읽어올 다음 요소가 남아있는지 확인, 있으면 true 없으면 false
Object next() 다음 요소 읽어오기, hasNext()가 true이면 next()를 호출하는 것이 안전함
void remove() next()로 읽어온 요소를 삭제, 반드시 next()를 먼저 호출한 후 호출해야함

 

ArrayList에 저장된 요소 출력

next()를 통해 읽은 요소값이 "c" 인 경우 해당 데이터를 제거하도록 했습니다.

제거 이전에는 리스트의 사이즈가 3이지만, 이후에는 2가 되는 것을 확인할 수 있습니다.

import java.util.*;

public class iteratorArrayList {
    public static void main(String[] args) {
        ArrayList<String> c = new ArrayList<>();
        c.add("a");
        c.add("b");
        c.add("c");

        Iterator it = c.iterator();
        System.out.println("size:" + c.size());
        System.out.println("==================");
        while(it.hasNext()) {
            String str = (String) it.next();
            if (str == "c") it.remove();
            System.out.println(str);
        }
        System.out.println("==================");
        System.out.println("size:" + c.size());
    }
}

출력 결과

 

Map에 저장된 요소 출력

map은 (key, value) 쌍으로 이루어져 있습니다. 따라서 iterator()를 직접적으로 호출할 수 없기 때문에 keySet(), values(),  entrySet() 와 같은 메서드를 통해서 Set()의 형태로 얻은 후 iterator()를 호출해주어야 합니다.

 

출력 결과가 일, 이, 삼이 아닌 이유는 HashMap은 입력된 순서대로 데이터가 쌓이지 않기 때문입니다. 즉, 순서를 보장하지 않기 때문입니다. 위의 예제에서 List클래스 같은 경우는 저장순서를 유지하기 때문에 Iterator를 사용해 출력했을 때도 저장 순서와 동일합니다.

import java.util.*;

public class iteratorMap {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("일", 1);
        map.put("이", 2);
        map.put("삼", 3);
        
        Iterator it = map.entrySet().iterator();
        
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

출력 결과


ListIterator

ListIterator는 Iterator를 상속받아서 기능을 추가한 것입니다. Iterator는 컬렉션 요소에 대해 단방향으로 접근이 가능하지만, ListIterator는 양방향으로 접근이 가능합니다. 

 

ListIterator는 ArrayList나 LinkedList와 같이 List인터페이스를 구현한 컬렉션에서만 사용이 가능합니다.

사용 가능한 메서드는 다음과 같습니다.

메서드 설명
void add(Object o) 컬렉션에 새로운 객체(o) 추가 
boolean hasNext() 읽어올 다음 요소가 남아있는지 확인, 있으면 true 없으면 false
boolean hasPrevious() 읽어올 이전 요소가 남아있는지 확인, 있으면 true, 없으면 false
Object next() 다음 요소 읽어오기, hasNext()가 true이면 next()를 호출하는 것이 안전함
Obejct previous() 이전 요소 읽어오기, hasPrevious()가 true이면 previous()를 호출하는 것이 안전함
int nextIndex() 다음 요소의 index 반환
int previousIndex() 이전 요소의 index 반환
void remove() next() 또는 previous()로 읽어온 요소를 삭제, 반드시 next() 또는 previous()를 호출한 후 호출해야함
void set(Obejct o) next() 또는 previous()로 읽어온 요소를 지정된 객체(o)로 변경, 반드시 next() 또는 previous()를 호출한 후 호출해야함

 

ArrayList에 저장된 요소 출력

next()를 사용하여 순방향으로, previous()를 사용하여 역방향으로 List에 저장된 요소를 출력하는 것을 확인할 수 있습니다.

import java.util.*;

public class listIterator {
    public static void main(String[] args) {
        ArrayList<Integer> arr = new ArrayList<>();
        arr.add(1);
        arr.add(2);
        arr.add(3);

        ListIterator it = arr.listIterator();
        while(it.hasNext()) {
            System.out.println("index: " + it.nextIndex() + " value: " + it.next());
        }
        System.out.println("==================");
        while(it.hasPrevious()) {
            System.out.println("index: " + it.previousIndex() + " value: " + it.previous());
        }
    }
}

728x90