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());
}
}
}
'Language > Java' 카테고리의 다른 글
[Java] Dynamic Programming, DP에 대해 알아보자 (0) | 2023.03.11 |
---|---|
[Java] 스트림이란? 스트림stream 사용하기 (0) | 2023.03.11 |
[Java] String 배열 대소문자 구분 없이 오름차순/내림차순 정렬하기 (0) | 2023.03.10 |
[Java] 객체 배열/리스트 오름차순,내림차순 정렬과 다중 조건 정렬 (0) | 2023.03.09 |
[Java] int 배열, List 오름차순/내림차순 정렬 (0) | 2023.03.09 |