Iterator, ListIterator, Enumeration p614~
Iterator, ListIterator, Enumeration은 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스
Enumeration - Iterator의 구버전
ListIterator - Iterator의 기능 향상 시킨 것
Iterator
컬렉션 프레임워크에서 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화
컬렉션에 각 요소에 접근하는 기능을 가진 Iterator인터페이스를 정의
-> Collection인터페이스에 Iterator반환하는 iterator()메소드 정의
iterator()로 Iterator를 얻은 후 컬렉션 클래스의 요소들을 읽어 올 수 있음
Map인터페이스를 구현한 클래스는 키와 값을 쌍으로 저장해서 iterator()를 직접호출 불가,
-> keySet()이나 entrySet()과 같은 메소드로 키와 값을 각각 따로 Set의 형태로 얻은 후 iterator()호출해야 Iterator획득
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorEx1 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
Iterator it = list.iterator(); // Iterator 획득
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
}
}
|
cs |
출력
1
2
3
4
5
ListIterator와 Enumeration
Enumeration - Iterator의 구버전
ListIterator - Iterator에 양방향 조회기능추가(List를 구현한 경우만 사용가능)
|
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
|
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorEx1 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
ListIterator lit = list.listIterator(); // ListIterator 획득
while(lit.hasNext()) // 순차적으로 읽어옴
System.out.print(lit.next());
System.out.println();
while(lit.hasPrevious()) // 역방향으로 읽어옴
System.out.print(lit.previous());
System.out.println();
}
}
|
cs |
출력
12345
54321
|
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
33
34
35
|
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorEx2 {
public static void main(String[] args) {
ArrayList original = new ArrayList(10);
ArrayList copy1 = new ArrayList(10);
ArrayList copy2 = new ArrayList(10);
for(int i=0; i<10; i++) // original에 요소 저장
original.add(i+"");
Iterator it = original.iterator(); // Iterator 획득
while(it.hasNext()) // original의 요소를 copy1에 복사
copy1.add(it.next());
System.out.println("= Original에서 copy1로 복사 =");
System.out.println("original:" + original);
System.out.println("copy1:" + copy1);
System.out.println();
it = original.iterator(); // 획득한 Iterator는 재사용 x -> 다시 얻어옴
while(it.hasNext()) { // original의 요소를 copy2에 복사, original요소는 삭제
copy2.add(it.next());
it.remove();
}
System.out.println("= Original에서 copy2로 복사 =");
System.out.println("original:" + original);
System.out.println("copy2:" + copy2);
}
}
|
cs |
출력
= Original에서 copy1로 복사 =
original:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
copy1:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
= Original에서 copy2로 복사 =
original:[]
copy2:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
--> 27행에 의해 original의 요소들은 copy2에 복사 후, 삭제
Arrays
배열을 다루는데 유용한 메소드 정의
배열 복사
copyOf() - 배열 전체 복사
copyOfRange() - 배열의 일부 복사, 지정된 범위의 끝은 포함x
배열 채우기
fill() - 배열의 모든 요소를 지정된 값으로 채움
setAll() - 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받음
배열 정렬/검색
sort() - 배열 정렬
binarySearch() - 배열 검색, 정렬이 선행되어야 함
문자열 비교/출력
equals() - 두 배열에 저장된 모든 요소를 비교해서 같으면 true
- 다차원 배열 비교에는 deepEquals() 사용
toString() - 배열의 모든 요소를 문자열로 출력
- 다차원 배열에는 deepToString()사용
배열 -> List 변환
asList() - 배열을 List에 담아서 변환
Comparator와 Comparable
Arrays.sort()를 호출 시, 정렬되는 이유는 Character클래스의 Comparable의 구현에 의해 정렬된 것
Comparator와 Comparable은 인터페이스로, 컬렉션을 정렬하는데 필요한 메소드를 정의
Comparable
- 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들(ex. Wrapper, String, File등)에 구현
- 기본적으로 오름차순, 작은 값에서부터 큰 값의 순으로 정렬되도록 구현
- 기본 정렬기준을 구현하는데 사용
Comparator
- 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용
|
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
33
34
35
|
import java.util.Arrays;
import java.util.Comparator;
// 기본 정렬기준 외에 다른기준으로 정렬하기위해 Comparator인터페이스 구현한 클래스 생성
class Descending implements Comparator {
// Comparator인터페이스의 메소드 구현
@Override
public int compare(Object o1, Object o2) {
// 정렬방식을 역으로 변경 if(o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable)o1;
Comparable c2 = (Comparable)o2;
return c1.compareTo(c2) * -1; // 정렬방식을 역으로 변경
// c2.compareTo(c1);과 같은의미
}
return -1;
}
}
public class ComparatorEx {
public static void main(String[] args) {
String[] strArr = {"cat","Dog","lion","tiger"};
Arrays.sort(strArr);
System.out.println(Arrays.toString(strArr));
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); // 대소문자 구분x
System.out.println(Arrays.toString(strArr));
Arrays.sort(strArr, new Descending()); // 역순
System.out.println(Arrays.toString(strArr));
}
}
|
cs |
출력
[Dog, cat, lion, tiger]
[cat, Dog, lion, tiger]
[tiger, lion, cat, Dog]
24행의 sort()와 27,30행의 sort()는 다름
24행 - Comparable에 의한 정렬
27,30행 - 지정한 Comparator에 의한 정렬
'아카이브 > 자바의 정석' 카테고리의 다른 글
| 11장 컬렉션프레임워크 20201109 (0) | 2020.11.09 |
|---|---|
| 11장 컬렉션프레임워크 20201106 (0) | 2020.11.06 |
| 11장 컬렉션프레임워크 20201029 (0) | 2020.10.29 |
| 11장 컬렉션 프레임워크 20201026 (0) | 2020.10.26 |
| 9장 java.lang패키지와 유용한 클래스 20201024 (0) | 2020.10.24 |