본문 바로가기

Language/Java

[JAVA] Iterator

1. 뜻

배열, 컬렉션 프레임 워크등을 순회할 때, 지금 위치가 어딘지 알려주는 '책갈피 같은 존재'

Iterator를 원하는 위치로 이동 시켜서 원하는 작업(조회, 추가, 삭제)을 시킨다.   

(1)Iterator의 초기 위치

(2) 반복자 적을 때 Tip

반복자 선언문의 오른쪽 편만 다 적어놓고, iterator(); 에 ctrl + alt + V 누르면  왼쪽이 자동 완성됨.

Mudo.entrySet().iterator();

//ctrl + alt + v

Iterator<Map.Entry<String, Integer>> itEn3 = Mudo.entrySet().iterator();

2. 코드리뷰

package Chap_09;

import java.util.*;

public class _08_Iterator {
    public static void main(String[] args) {
        //iterator
        
        //반복자 쓸 리스트 선언
        List<String> list = new ArrayList<>();


		// 더미 값이 리스트에 많이 추가된 상황 가정
        list.add("유재석");
        list.add("(알 수 없음)");
        list.add("김종국");
        list.add("(알 수 없음)");
        list.add("강호동");
        list.add("(알 수 없음)");
        list.add("박명수");
        list.add("(알 수 없음)");
        list.add("조세호");

        for (String s :
                list) {
            System.out.println(s);
        }
        System.out.println("-------------------------");


		//반복자 선언: Iterator<자료형> 반복자_이름 = 자료구조.iterator();
        //it = list.iterator();에 마우스 옮기고 Ctrl + alt + v 하면 자동으로 완성
        Iterator<String> it = list.iterator();
        System.out.println(it.next());
        System.out.println(it.next());
        System.out.println(it.next());
        System.out.println(it.next());

        System.out.println("-------------------------");
        
        
        //커서를 처음 위치로 이동
        it = list.iterator();

		//반복자 순회 -> it.hasNext(); => 반복자가 넘어갈 다음 값이 있는지 boolean 반환
        while(it.hasNext()) {
            System.out.println(it.next());
        }

        System.out.println("-------------------------");
        
        
        // it.next() => 현재 커서 위치 기준 다음 요소를 가져온다. 
        // s.contains() method => () 값이 String 값 안에 있는지 확인하여 boolean 반환
        // s.contains()는 대소문자 구분하고, 공백도 구분해서 다른 값이라 인지 함.
        // ex) " my"랑 "my"랑 다은 값으로 인지
        
        it = list.iterator();
        while(it.hasNext()){
            String s = it.next();
            if(s.contains("(알 수 없음)")){
                //커서가 있는 위치의 list 값을 제거
                it.remove();
            }
        }


        it = list.iterator();

        while(it.hasNext()) {
            System.out.println(it.next());
        }
        System.out.println("-------------------------");

        HashSet<String> set = new HashSet<>();
        set.add("유재석");
        set.add("박명수");

        Iterator<String> itSet = set.iterator();

        while(itSet.hasNext()){
            System.out.println(itSet.next());
        }
        System.out.println("-------------------------");

        HashMap<String, Integer> map = new HashMap<>();
        map.put("유재석", 10);
        map.put("박명수", 5);

        // map.iterator();는 틀린 표현.
        // why? -> map의 Key와 Value 중 어떤 값을 기준으로 반복자가 순회하는지 모호하기 때문


        //Key를 기준으로 Iterator 순회
        Iterator<String> itMapKey = map.keySet().iterator();
        while (itMapKey.hasNext()){
            System.out.println(itMapKey.next());
        }

        System.out.println("-------------------------");


		// Value를 기준으로 Iterator 순회
        Iterator<Integer> itMapValue = map.values().iterator();

        while (itMapValue.hasNext()){
            System.out.println(itMapValue.next());
        }

        System.out.println("-------------------------");

		// <K,V> 한 쌍을 기준으로 Iterator 순회 
        Iterator<Map.Entry<String, Integer>> itMap = map.entrySet().iterator();
        while (itMap.hasNext()){
            System.out.println(itMap.next());
        }


    }
}

*마지막 HashMap 한 쌍 기준 순회의 결과  값

Key=Value 형태로 나옴

3. 스스로 해보기

import java.util.*;

public class Iterator_Myself {
    public static void main(String[] args) {

        // ArrayList 에 관해서 iterator 순회
        // 리스트 선언
        ArrayList<String> Entry = new ArrayList<>();

        Entry.add("이대은");
        Entry.add("이 Unknown");
        Entry.add("송승준");
        Entry.add("송 Unknown");
        Entry.add("오준원");
        Entry.add("오 Unknown");
        Entry.add("이홍구");
        Entry.add("이 Unknown");
        Entry.add("이대호");
        Entry.add("이 Unknown");
        Entry.add("심수창");
        Entry.add("심 Unknown");
        Entry.add("유희관");
        Entry.add("유 Unknown");

        //리스트 순회

        for (String s :
                Entry) {
            System.out.println(s);
        }

        System.out.println("--------------------------------");

        //반복자 선언
        Iterator<String> itArray = Entry.iterator();



        //반복자를 이용해 순회

        while (itArray.hasNext()){
            System.out.println(itArray.next());
        }

        System.out.println("-------------------------------");

        //반복자 초기 위치로 원상복귀
        itArray = Entry.iterator();

        System.out.println(itArray.next());

        System.out.println("-------------------------------");


        //반복자를 이용해 "(알 수 없음)" 이란 말이 들어간 원소들 지우기 -> 지우고 난 뒤 전체 순회

        while (itArray.hasNext()){
            String temp = itArray.next();

            if(temp.contains("Unknown")){
                itArray.remove();
            }
        }

        for (String s :
                Entry) {
            System.out.println(s);
        }

        System.out.println("-------------------------------");


        // HashSet 에 관해서 iterator 순회
        // HashSet 선언
        HashSet<String> Entry2 = new HashSet<>();
        Entry2.add("손흥민");
        Entry2.add("이강인");
        Entry2.add("김민재");
        Entry2.add("황희찬");
        Entry2.add("이재성");
        Entry2.add("오현규");
        Entry2.add("정우영");

        // 반복자 선언
        Iterator<String> itEn2 = Entry2.iterator();

        // 반복자로 순회
        while (itEn2.hasNext()){
            System.out.println(itEn2.next());
        }

        System.out.println("-------------------------------");

        // HashMap 에 관해서 iterator 순회
        // HashMap 선언

        HashMap<String, Integer> Mudo = new HashMap<>();
        Mudo.put("유재석",1);
        Mudo.put("박명수",2);
        Mudo.put("정준하",3);
        Mudo.put("노홍철",4);
        Mudo.put("하하",5);
        Mudo.put("정형돈",6);
        Mudo.put("길",7);


        // Key 를 기준으로 Iterator 만들어서 순회
        Iterator<String> KeyIt = Mudo.keySet().iterator();

        while (KeyIt.hasNext()){
            System.out.println(KeyIt.next());
        }
        System.out.println("-------------------------------");

        // Value 를 기준으로 Iterator 만들어서 순회
        Iterator<Integer> ValueIt = Mudo.values().iterator();

        while (ValueIt.hasNext()){
            System.out.println(ValueIt.next());
        }

        System.out.println("-------------------------------");

        // <K,V> 한 쌍을 기준으로 Iterator 만들어서 순회

        Iterator<Map.Entry<String, Integer>> itEn3 = Mudo.entrySet().iterator();

        while (itEn3.hasNext()){
            System.out.println(itEn3.next());
        }
    }
}

'Language > Java' 카테고리의 다른 글

[JAVA] 람다식과 함수형 인터페이스  (0) 2023.02.16
[JAVA] 익명 클래스  (0) 2023.02.15
[JAVA] HashMap  (0) 2023.02.13
[JAVA]HashSet  (0) 2023.02.09
[JAVA] Linked List  (0) 2023.02.08