반드시 컬렉션 객체와 연관되어야 하며, 보통 컬렉션의 내부 클래스(inner class)로서 iterator 메서드를 통해 사용
Iterator는 내부 데이터 구조를 순회함
Object next()
내부 구조에서 다음 항목을 반환합니다.
boolean hasNext()
구조 내에 더 많은 항목이 있는지 여부를 반환합니다.
void remove()
현재 항목을 구조에서 제거합니다.
Iterator<String> iterator = myArrayList.iterator();와 같이 사용import java.util.ArrayList;
import java.util.Iterator;
public class ArrayListIteratorExample {
public static void main(String[] args) {
// ArrayList 생성 및 요소 추가
ArrayList<String> myArrayList = new ArrayList<>();
myArrayList.add("A");
myArrayList.add("B");
myArrayList.add("C");
// Iterator를 통해 요소 순회
Iterator<String> iterator = myArrayList.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
System.out.println(item);
// 요소 "B"를 제거
if (item.equals("B")) {
iterator.remove();
}
}
// 제거 후 ArrayList 출력
System.out.println("After removal:");
for (String item : myArrayList) {
System.out.println(item);
}
}
}
import java.util.ArrayList;
import java.util.Iterator;
import java.util.ConcurrentModificationException;
public class GenericManager<T> {
private ArrayList<T> items;
public GenericManager() {
this.items = new ArrayList<>();
}
// 요소 추가 메서드
public void addItem(T item) {
items.add(item);
}
// 요소 제거 메서드
public void removeItem(T item) {
items.remove(item);
}
// 이터레이터를 사용하여 리스트를 순회하는 메서드
public void iterateItems() {
try {
for (Iterator<T> iterator = items.iterator(); iterator.hasNext(); ) {
T item = iterator.next();
System.out.println(item);
// 특정 조건을 만족하면 요소를 제거
if (/* 조건 */ item.equals("B")) {
iterator.remove();
}
}
} catch (ConcurrentModificationException e) {
System.out.println("ConcurrentModificationException 발생: 이터레이터 사용 시 리스트를 직접 수정할 수 없습니다.");
}
}
public static void main(String[] args) {
GenericManager<String> manager = new GenericManager<>();
manager.addItem("A");
manager.addItem("B");
manager.addItem("C");
System.out.println("초기 리스트:");
manager.iterateItems();
System.out.println("요소 제거 후 리스트:");
manager.iterateItems();
}
}
import java.util.Iterator;
import java.util.NoSuchElementException;
public class CustomCollection<T> implements Iterable<T> {
private T[] items;
private int size;
@SuppressWarnings("unchecked")
public CustomCollection(int capacity) {
items = (T[]) new Object[capacity];
size = 0;
}
// 요소 추가 메서드
public void add(T item) {
if (size == items.length) {
throw new IllegalStateException("컬렉션이 가득 찼습니다.");
}
items[size++] = item;
}
// 요소 제거 메서드
public void remove(T item) {
for (int i = 0; i < size; i++) {
if (items[i].equals(item)) {
for (int j = i; j < size - 1; j++) {
items[j] = items[j + 1];
}
items[--size] = null;
return;
}
}
throw new NoSuchElementException("요소가 컬렉션에 없습니다.");
}
// 컬렉션의 크기 반환 메서드
public int size() {
return size;
}
// 이터레이터를 반환하는 메서드
@Override
public Iterator<T> iterator() {
return new CustomIterator();
}
// 내부 클래스: CustomIterator
private class CustomIterator implements Iterator<T> {
private int currentIndex = 0;
@Override
public boolean hasNext() {
return currentIndex < size;
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
return items[currentIndex++];
}
@Override
public void remove() {
if (currentIndex <= 0) {
throw new IllegalStateException("next()를 먼저 호출해야 합니다.");
}
CustomCollection.this.remove(items[currentIndex - 1]);
currentIndex--;
}
}
public static void main(String[] args) {
CustomCollection<String> customCollection = new CustomCollection<>(10);
customCollection.add("A");
customCollection.add("B");
customCollection.add("C");
System.out.println("초기 컬렉션:");
for (String item : customCollection) {
System.out.println(item);
}
// 이터레이터를 사용하여 "B" 요소 제거
Iterator<String> iterator = customCollection.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (item.equals("B")) {
iterator.remove();
}
}
System.out.println("요소 제거 후 컬렉션:");
for (String item : customCollection) {
System.out.println(item);
}
}
}
내가 구현한 iterator for 사용자 정의 hashmap
public void printElements() {
for (int i = 0; i < a.size(); i++) {
LinkedList<Pair<K, V>> bucket = a.get(i);
System.out.println("Bucket " + i + ":");
Iterator<Pair<K, V>> iterator = bucket.iterator();
while (iterator.hasNext()) {
Pair<K, V> pair = iterator.next();
System.out.println(" " + pair.getKey() + " -> " + pair.getValue());
}
}
}
@Override
public Iterator<Pair<K, V>> iterator() {
return new Iterator<Pair<K, V>>() {
private int i = 0;
Iterator<Pair<K, V>> bucketIterator = a.get(i).iterator(); //
@Override
public boolean hasNext() {
while(!bucketIterator.hasNext()) {
i++;
if (i >= a.size()) {
return false;
}
bucketIterator = a.get(i).iterator();
}
return true;
//returns whether the Linked List has a next element //your code
}
@Override
public Pair<K, V> next() {
if(!hasNext()) {
throw new NoSuchElementException();
}
return bucketIterator.next();
//returns the next element of the linked List // your code
}
};
}