백준 알고리즘의 에디터를 문제를 풀다가 계속 시간초과로 고생하면서, ListIterator에 대한 존재를 공부하면서 어떤 것인지 정리해둔 내용이다.
관련 문제
Iterator
와 ListIterator
는 컬렉션을 순회(iterate)하기 위해 제공되는 인터페이스입니다.
둘 다 컬렉션 요소를 하나씩 탐색할 수 있게 해주지만, 기능과 사용 대상에서 차이가 있습니다.
컬렉션의 종류:
Set
이나 Queue
를 순회하려면 Iterator
를 사용.List
를 순회하거나 조작하려면 ListIterator
를 사용.필요한 기능:
Iterator
가 적합.ListIterator
를 사용.Iterator
는 컬렉션(Collection) 인터페이스를 순회하기 위해 사용되는 인터페이스입니다.메서드 | 설명 |
---|---|
boolean hasNext() | 컬렉션에 다음 요소가 있으면 true , 없으면 false 를 반환. |
E next() | 커서를 다음 요소로 이동하고 해당 요소를 반환. |
void remove() | 마지막으로 반환된 요소를 컬렉션에서 삭제. (next() 를 호출한 이후에만 사용 가능.) |
Iterator
는 컬렉션을 앞에서 뒤로 한 방향으로만 탐색할 수 있습니다.remove()
를 통해 지원되며, 삽입이나 수정 기능은 제공하지 않습니다.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]
}
}
ListIterator
는 Iterator
를 확장한 인터페이스로, 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() 호출 후 사용 가능.) |
previous()
) 또는 뒤로(next()
) 이동이 가능합니다.add()
), 기존 요소를 수정(set()
), 또는 삭제(remove()
)할 수 있습니다.ListIterator
는 List
계열(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 |
---|---|---|
지원 컬렉션 | 모든 컬렉션 (Set , List , Queue 등) | List 계열 컬렉션 (ArrayList , LinkedList 등) |
순회 방향 | 단방향 | 양방향 |
삽입 | 지원 안 함 | 지원 (add(E e) ) |
삭제 | 지원 (remove() ) | 지원 (remove() ) |
수정 | 지원 안 함 | 지원 (set(E e) ) |
현재 위치 인덱스 | 제공 안 함 | 제공 (nextIndex() , previousIndex() ) |
커서 위치 관리 | 기본 제공 (단방향) | 양방향 커서 이동 가능 |