공부/Java

[Java] Iterators 인터페이스 (자바의 정석)

leejinwoo1126 2023. 7. 31. 21:14
반응형

 


목차

     


    Interface Iterators<E> 

    컬렉션에 저장된 요소들을 읽어오는 방법을 표준화

     

    - Java 1.2 버전부터 지원

    - 기본적으로 Iterators 변환의 경우 1회용이므로 순차조회 완료 시 재생성 해야함

    - ListIterator의 경우 양방향으로 요소 접근이 가능하다 ( Enumeration과 Iterator는 단방향 )

     

     

    보통 요소가 있는지 확인(hasNext)하고, 요소를 읽는 것이 안전(next)하다 

     

    사용 방법

    Collection 인터페이스의 iterator() 호출해서 Iterator 구현 객체를 얻어 사용

     

    (1) List 

    @DisplayName("Collection interface 구현체는 iterator 객체를 얻어서 요소 조회가 가능하다")
    @Test
    void listIteratorTest() {
        // given [1, 2, 3, 4, 5, 6, 7, 8, 9]
        List<Integer> list = IntStream.range(1, 10).boxed().collect(Collectors.toList());
    
        // when
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()) {
            int i = iterator.next();
    
            if(i % 2 == 0) iterator.remove(); // 짝수 제거
        }
    
        // then
        assertThat(list).hasSize(5);
        assertThat(list).containsExactly(1, 3, 5, 7, 9);
    }

     

    (2) Set

    @DisplayName("Collection interface 구현한 Set 또한 Iterator 동일하게 적용가능하다")
    @Test
    void setIteratorTest() {
        // given [1, 2, 3, 4, 5, 6, 7, 8, 9]
        Set<Integer> data = IntStream.range(1, 10).boxed().collect(Collectors.toCollection(TreeSet::new));
    
        // when
        Iterator<Integer> iterator = data.iterator();
        while(iterator.hasNext()) {
            int i = iterator.next();
    
            if(i % 2 == 1) iterator.remove(); // 홀수 제거
        }
    
        // then
        assertThat(data).hasSize(4);
        assertThat(data).contains(2, 4, 6, 8);
    }

     

    (3) Map

    - Map의 경우 Collection 인터페이스 구현하지 않으므로 iterator() 가 없다

    - keySet(), entrySet(), values()를 사용하여 Iterator객체 호출가능

     

    예시1. keySet()

    @Test
    void mapIteratorTestByKeySet() {
        // given
        Map<String, Integer> data = new HashMap<>();
        data.put("A", 1);
        data.put("B", 2);
        data.put("C", 3);
        data.put("D", 4);
    
        // when
        Iterator<Integer> iterator = data.values().iterator();
        while(iterator.hasNext()) {
            int next = iterator.next();
    
            if(next % 2 == 0) {
                iterator.remove();
            }
        }
    
        // then
        assertThat(data).hasSize(2);
        assertThat(data).containsEntry("A", 1).containsEntry("C", 3);
    }

     

    예시2. entrySet()

    @Test
    void mapIteratorTestByEntrySet() {
        // given
        Map<String, Integer> data = new HashMap<>();
        data.put("A", 1);
        data.put("B", 2);
        data.put("C", 3);
        data.put("D", 4);
    
        // when
        Iterator<Map.Entry<String, Integer>> iterator = data.entrySet().iterator();
        while(iterator.hasNext()) {
            Map.Entry<String, Integer> next = iterator.next();
    
            if(data.get(next.getKey()) % 2 == 1) {
                iterator.remove();
            }
        }
    
        // TODO. MAP 에서 key 존재 여부 검사
        // then
        assertThat(data).hasSize(2);
        assertThat(data).containsEntry("B", 2).containsEntry("D", 4);
    }

     

    예시3. values()

    @Test
    void mapIteratorTestByValues() {
        // given
        Map<String, Integer> data = new HashMap<>();
        data.put("A", 1);
        data.put("B", 2);
        data.put("C", 3);
        data.put("D", 4);
    
        // when
        Iterator<String> keyIterator = data.keySet().iterator();
        while(keyIterator.hasNext()) {
            String key = keyIterator.next();
    
            if(data.get(key) % 2 == 1) {
                keyIterator.remove();
            }
        }
    
        // then
        assertThat(data).hasSize(2);
        assertThat(data).containsEntry("B", 2).containsEntry("D", 4);
    }

    참고

    https://www.youtube.com/watch?v=k5qxJ53RYNc 

    https://www.geeksforgeeks.org/iterators-in-java/

     

    Iterators in Java - GeeksforGeeks

    A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

    www.geeksforgeeks.org

     

    https://www.baeldung.com/java-iterate-map

     

    반응형