[Java] 자바 #36, Iterator 반복자

Iterator


- 컬렉션 프레임워크에서 저장된 요소를 읽어오는 방법을 표준화하기 위한 역할(인터페이스)

- Collection의 하위 컬렉션들이 소유 -> Iterator 타입의 객체를 반환하는 메소드를 이미 구현

- List, Set계열에 구현(Map은 없음)

- 주로 읽기 전용으로 사용한다.


Iterator의 주요멤버

1. boolean hasNext()

2. T next()

3. remove()



ArrayList<String> list = new ArrayList<String>();

list.add("사과");

list.add("바나나");

list.add("포도");

list.add("파인애플");

list.add("복숭아");


List에 데이터를 담고 반복을 돌리는 방법?


1. for 문

for( int i =0; i<list.length; i++){

출력문( list.get(i) );

}


2. for-each문(향상된 for문)

for( String str : list ){

출력문( str );

}


3. Iterator 반복자

Iterator<String> iter = list.iterator();

while(iter.hasNext()){ //얘는 true, false 반환, 있으면 true, 없으면 false 이제 이정도 짬은 되겠죠?

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

}


Map 계열도 반복을 돌린다??


- 반복을 돌린다기보다는 전체 Map계열의 키를 알면 값을 알 수 있겠죠? 이런 맵계열 컬렉션의 특징을 통해 Iterator를 이용하여 반복을 돌릴수가 있습니다. 

- keySet() 메소드를 이용한다. -> Map계열의 전체 키Set을 반환.

- 코드로 보시죠.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Example{
    public static void main(String[] args){
        HashMap<StringString> map = new HashMap<StringString>();
        map.put("one""하나");
        map.put("two""둘");
        map.put("three""셋");
        map.put("four""넷");
        map.put("five""다섯");
        // 해쉬맵 루프 돌리기.
        // -Map계열은 순서가 없어서 루프 돌리기 힘들다.
        
        //Collection > List - Set
        Set<String> keys = map.keySet(); // 해쉬맵의 키의 집합.
        Iterator<String> iter = keys.iterator();
        while(iter.hasNext()) {
            String key = iter.next(); //*****
            System.out.printf("map.get(\"%s\")=%s\n",key,map.get(key));
        }
    }
}
cs


map의 key 데이터 타입과 같은 타입으로 Set 타입 객체를 반환하여 여기에 iterator를 만들고 키값을 돌리면 됩니다!!


1
2
3
4
5
6
7
8
9
class Example{
    public static void main(String[] args){
        Collection<String> value = map.values();//값의 집합.        
        iter = value.iterator();
        while(iter.hasNext()) {
            System.out.println(iter.next());
        }
    }
}
cs


하지만 이런식으로 직접 값들을 얻어올 수도 있습니다. 하지만 연관배열이라함은 키와 값을 연관지어 사용하는 것에 의미가 있으므로 value만 따로 전체 가져오는 행동은 그닥 쓰일만한 곳이 없을 것입니다만. 혹시나 알아두세요.


댓글

Designed by JB FACTORY