2013. 7. 29. 11:40

Interface Iterator<E>



다음은 Iterator 의 실제 소스다.

1
2
3
4
5
public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove();
}


List 는 인덱스가 존재하여 단순한 for문으로도 객체의 데이터를 가져올 수 있으며

향상된 포문문을 사용하면 Set의 데이터도 가져오는게 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
ArrayList<String> list = new ArrayList<String>();
list.add("하나");
list.add("둘");
list.add("셋");
 
for(String ele : list) {
    System.out.println(ele);
}
 
for(int loop=0; loop<list.size(); loop++) {
    System.out.println(list.get(loop));
}
 
HashSet<Integer> set = new HashSet<>();
set.add(1);
set.add(3);
set.add(2);
 
for(Integer ele : set) {
    System.out.println(ele);
}
 
 
하나
하나
1
2
3


List, Set 모두 Iterator를 구현해 놓은 클래스이기 때문에 향상된 포문을 사용할 수 있는 것이다.

하지만 Map은 인덱스도 없고 Iterator 구현도 없다. 어떻게 해야 할까



● boolean hasNext() : Iterator 객체가 다음요소를 소유하는지 여부를 불리언으로 리턴. 

● E next() : 다음요소를 리턴.

● void remove() : 컬렉션에서 Iterator 의해 반환된 마지막 요소를 제거. 


우선 아래는 List와 Set에서 Iterator를 사용하는 예제다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
ArrayList<String> list = new ArrayList<String>();
list.add("하나");
list.add("둘");
list.add("셋");
 
Iterator<String> it = list.iterator();
 
while(it.hasNext()) { //Iterator 객체에 다음 데이터가 있으면 true
    String ele = it.next(); //다음 데이터를 리턴
    System.out.println(ele);
}
 
 
HashSet<Integer> set = new HashSet<>();
set.add(1);
set.add(3);
set.add(2);
 
Iterator<Integer> it2 = set.iterator();
 
while(it2.hasNext()) {
    int ele = it2.next();
    System.out.println(ele);
}
 
 
하나
1
2
3


Map에선 다음과 같이 사용한다.

1
2
3
4
5
ArrayList<String> list = new ArrayList<String>();
HashMap<String, Integer> map = new HashMap<>();
map.put("일공일", 101);
map.put("이공이", 202);
map.put("삼공삼", 303);


여기서 keySet() 메서드로 key값을 Set 컬렉션으로 추출한다.

1
2
3
4
5
Set<String> set = map.keySet();
System.out.println(set);
 
 
[삼공삼, 일공일, 이공이]


이제 Iterator를 사용하여 value를 가져올 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
Iterator<String> it = set.iterator();
 
while(it.hasNext()) {
    String key = it.next();
    int value = map.get(key);
    System.out.println(key + " : " + value);
}
 
 
삼공삼 : 303
일공일 : 101
이공이 : 202


번거롭다면 향상된 포문을 써도 된다. (향상된 포문은 Java 5.0 이상에서만 사용가능)

1
2
3
4
5
6
7
8
9
10
11
Iterator<String> it = set.iterator();
 
for(String key : set) {
    int value = map.get(key);
    System.out.println(key + " : " + value);
}
 
 
삼공삼 : 303
일공일 : 101
이공이 : 202



● 완성 구문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.HashMap;
import java.util.Iterator;
 
public class LogicTest {
    public static void main(String[] args) throws Exception {
    
        HashMap<String, Integer> map = new HashMap<>();
        map.put("일공일", 101);
        map.put("이공이", 202);
        map.put("삼공삼", 303);
                 
        Iterator<String> it = map.keySet().iterator();       
         
        while(it.hasNext()) {
            String key = it.next();
            int value = map.get(key);
            System.out.println(key + " : " + value);
        }
    }
}


'java' 카테고리의 다른 글

Thread  (0) 2013.07.29
Properties  (0) 2013.07.26
Arrays  (0) 2013.07.25
File  (0) 2013.07.25
Class  (0) 2013.07.25
Posted by 1+1은?