JAVA_Iterator

0ne·2024년 6월 11일
0

java

목록 보기
8/11

Iterator<T> 인터페이스

Iterator<T> 인터페이스를 만족하는 모든 클래스의 객체는 Iterator\<T>타입으로 사용될 수 있다.

Iterator<T>는 독립적으로 존재 ㄴㄴ

  • 반드시 컬렉션 객체와 연관되어야 하며, 보통 컬렉션의 내부 클래스(inner class)로서 iterator 메서드를 통해 사용

  • Iterator는 내부 데이터 구조를 순회함
    Object next()
    내부 구조에서 다음 항목을 반환합니다.
    boolean hasNext()
    구조 내에 더 많은 항목이 있는지 여부를 반환합니다.
    void remove()
    현재 항목을 구조에서 제거합니다.

ArrayList에서 Iterator사용

  • ArrayList에서 Iterator를 사용하려면, 먼저 ArrayList로부터 이를 얻어야 합니다.
  • 예를 들어, 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();
    }
}

사용자 정의 컬렉션과 Iterator

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
            }
        };
    }
profile
@Hanyang univ(seoul). CSE

0개의 댓글