[JAVA] Iterator 와 ListIterator?

Gaeng·2024년 11월 28일
0

Java 알고리즘

목록 보기
6/6

Iterator 와 ListIterator?

백준 알고리즘의 에디터를 문제를 풀다가 계속 시간초과로 고생하면서, ListIterator에 대한 존재를 공부하면서 어떤 것인지 정리해둔 내용이다.
관련 문제

Iterator와 ListIterator의 차이

IteratorListIterator컬렉션을 순회(iterate)하기 위해 제공되는 인터페이스입니다.
둘 다 컬렉션 요소를 하나씩 탐색할 수 있게 해주지만, 기능과 사용 대상에서 차이가 있습니다.

사용 시 선택 기준

  1. 컬렉션의 종류:

    • Set이나 Queue를 순회하려면 Iterator를 사용.
    • List를 순회하거나 조작하려면 ListIterator를 사용.
  2. 필요한 기능:

    • 단순히 컬렉션을 순회하고 삭제만 할 경우 Iterator가 적합.
    • 요소를 삽입, 수정하거나 양방향 이동이 필요할 경우 ListIterator를 사용.

1. Iterator(단방향)

정의

  • Iterator컬렉션(Collection) 인터페이스를 순회하기 위해 사용되는 인터페이스입니다.
  • 단방향으로만 이동하며, 기본적인 탐색 및 삭제 기능만 제공합니다.

주요 메서드

메서드설명
boolean hasNext()컬렉션에 다음 요소가 있으면 true, 없으면 false를 반환.
E next()커서를 다음 요소로 이동하고 해당 요소를 반환.
void remove()마지막으로 반환된 요소를 컬렉션에서 삭제. (next()를 호출한 이후에만 사용 가능.)

특징

  1. 단방향 이동:
    • Iterator는 컬렉션을 앞에서 뒤로 한 방향으로만 탐색할 수 있습니다.
  2. 읽기 및 삭제 가능:
    • 요소를 읽을 수 있고, 현재 위치의 요소를 삭제할 수 있습니다.
    • 삭제는 remove()를 통해 지원되며, 삽입이나 수정 기능은 제공하지 않습니다.
  3. 범용성:
    • 대부분의 컬렉션(ArrayList, HashSet, LinkedList, TreeSet 등)에서 사용 가능합니다.

예제

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            String element = iterator.next();
            System.out.println(element);

            // 삭제
            if (element.equals("B")) {
                iterator.remove();
            }
        }

        System.out.println(list); // 출력: [A, C, D]
    }
}

2. ListIterator(양방향)

정의

  • ListIteratorIterator를 확장한 인터페이스로, List 계열의 컬렉션에서 사용됩니다.
  • 양방향 이동 및 삽입, 삭제, 수정과 같은 기능을 제공합니다.

주요 메서드

메서드설명
boolean hasNext()커서 이후에 요소가 있으면 true, 없으면 false.
E next()커서를 오른쪽으로 이동하고, 이동한 위치의 요소를 반환.
boolean hasPrevious()커서 이전에 요소가 있으면 true, 없으면 false.
E previous()커서를 왼쪽으로 이동하고, 이동한 위치의 요소를 반환.
int nextIndex()커서 이후에 있는 요소의 인덱스를 반환.
int previousIndex()커서 이전에 있는 요소의 인덱스를 반환.
void add(E e)커서 위치에 새 요소를 삽입.
void set(E e)마지막으로 반환된 요소를 수정.
void remove()마지막으로 반환된 요소를 삭제. (next()previous() 호출 후 사용 가능.)

특징

  1. 양방향 이동:
    • 커서를 기준으로 앞으로(previous()) 또는 뒤로(next()) 이동이 가능합니다.
  2. 읽기, 삭제, 삽입, 수정 가능:
    • 요소를 읽거나, 새 요소를 삽입(add()), 기존 요소를 수정(set()), 또는 삭제(remove())할 수 있습니다.
  3. List 전용:
    • ListIteratorList 계열(ArrayList, LinkedList, Vector, Stack)에서만 사용 가능합니다.

예제

import java.util.*;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));

        ListIterator<String> listIterator = list.listIterator();

        // 순방향 이동
        while (listIterator.hasNext()) {
            String element = listIterator.next();
            System.out.println("Next: " + element);

            // 요소 수정
            if (element.equals("B")) {
                listIterator.set("X");
            }
        }

        // 역방향 이동
        while (listIterator.hasPrevious()) {
            String element = listIterator.previous();
            System.out.println("Previous: " + element);

            // 요소 삽입
            if (element.equals("C")) {
                listIterator.add("Y");
            }
        }

        System.out.println(list); // 출력: [A, X, C, Y, D]
    }
}

Iterator와 ListIterator의 차이

특징IteratorListIterator
지원 컬렉션모든 컬렉션 (Set, List, Queue 등)List 계열 컬렉션 (ArrayList, LinkedList 등)
순회 방향단방향양방향
삽입지원 안 함지원 (add(E e))
삭제지원 (remove())지원 (remove())
수정지원 안 함지원 (set(E e))
현재 위치 인덱스제공 안 함제공 (nextIndex(), previousIndex())
커서 위치 관리기본 제공 (단방향)양방향 커서 이동 가능

자료출처 : https://www.geeksforgeeks.org/listiterator-in-java/

profile
문제를 해결하면서 나온 문제를 기록하는 노트

0개의 댓글