[기본 개념] 6 | (1.6) Arrays, Comparator, Comparable
1 컬렉션 프레임웍의 핵심 인터페이스
2 ArrayList
3 LinkedList
4 Stack과 Queue
5 Iterator, Listlterator, Enumeration
6> Arrays
7> Comparator와 Comparable
8 HashSet
9 TreeSet
10 HashMap과 Hashtable
11 TreeMap
12 Properties
13 Collections
14 컬렉션 클래스 정리 & 요약
6. Arrays
배열의 복사 - copyOf( ), copyOfRange( )
copyOf( ) 배열 전체 복사해서 새로운 배열을 만들어 반환
copyOfRange( ) 배열의 일부 복사해서 새로운 배열을 만들어 반환
int[ ] arr = {0, 1, 2, 3, 4} ;
int[ ] arr2 = Arrays.copyOf(arr, arr.length) ; // arr2 = [0, 1, 2, 3, 4]
int[ ] arr3 = Arrays.copyOf(arr, 3) ; // arr3 = [0, 1, 2]
int[ ] arr4 = Arrays.copyOf(arr, 7) ; // arr4 = [0, 1, 2, 3, 4, 0, 0]
int[ ] arr5 = Arrays.copyOfRange(arr, 2, 4) ; // arr5 = [2, 3]
int[ ] arr6 = Arrays.copyOfRange(arr, 0, 7) ; // arr6 = [0, 1, 2, 3, 4, 0, 0]
배열 채우기 - fill( ), setAll( )
fill( ) 배열의 모든 요소를 지정된 값으로 채움
setAll( ) 배열을 채우는 데 사용할 함수형 인터페이스를 매개변수로 받음
int[ ] arr = new int[5] ;
Arrays.fill(arr, 9) ; // arr = [9, 9, 9, 9, 9]
Arrays.setAll(arr, ( ) -> (int)(Math.random( ) * 5) + 1) ; // arr = [1, 5, 2, 1, 1]
배열의 정렬과 검색 - sort( ), binarySearch( )
sort( ) 배열을 정렬
binarySearch( ) 배열에 저장된 요소를 검색. 정렬된 상태여야 함
int[ ] arr = {3, 2, 0, 1, 4} ;
int idx = Arrays.binarySearch(arr, 2) ; // idx = -5 <-- 잘못된 결과
Arrays.sort(arr) ; // 배열 arr을 정렬
System.out.println(Arrays.toString(arr)) ; // [0, 1, 2, 3, 4]
int idx = Arrays.binarySearch(arr, 2) ; // idx = 2 <-- 올바른 결과
배열의 비교와 출력 - equals( ), toString( )
equals( ) 두 배열에 저장된 모든 요소를 비교해서 true, false반환. 일차원 배열에만 사용
deepEquals( ) 다차원 배열의 비교 시 사용
toString( ) 배열의 모든 요소를 문자열로 출력. 일차원 배열에서만 사용
deepToString( ) 다차원 배열에서 사용
2차원 String배열에서 equals( )로 비교하면 저장된 내용이 같아도 false를 얻는다. 다차원 배열은 문자열을 비교하는 것이 아니라 '배열에 저장된 배열의 주소'를 비교하기 때문에 서로 다른 배열은 항상 주소가 다르다.
배열을 List로 변환 - asList(Object... a)
asList( ) 배열을 List에 담아서 반환. 저장할 요소들만 나열 가능. 추가/삭제 불가능
List list = Arrays.asList(new Integer[ ] {1, 2, 3, 4, 5}) ; // list = [1, 2, 3, 4, 5]
List list = Arrays.asList(1, 2, 3, 4, 5) ; // list = [1, 2, 3, 4, 5]
list.add(6) ; // UnsupportedOperationException 예외 발생
asList( )는 반환한 List의 크기를 변경할 수 없어서 추가, 삭제가 불가능하다. 그러나 저장된 내용은 변경 가능한데, 크기를 변경할 수 있는 List가 필요하면 다음처럼 하면 된다.
List list = new ArrayList(Arrays.asList(1, 2, 3, 4, 5)) ;
parallelXXX( ), spliterator( ), stream( )
'parallel'로 시작하는 이름의 메서드들은 빠른 결과를 얻기 위해 여러 쓰레드가 작업을 나누어 처리하도록 한다.
spliterator( ) 하나의 작업을 여러 작업으로 나누는 Spliterator 반환
stream( ) 컬렉션을 스트림으로 변환
예제/ArraysEx.java
import java.util.*;
public class ArraysEx {
public static void main(String[] args) {
int[] arr = {0, 1, 2, 3, 4};
int[][] arr2D = {{11, 12, 13}, {21, 22, 23}};
System.out.println("arr = " + Arrays.toString(arr));
System.out.println("arr2D = " + Arrays.deepToString(arr2D));
int[] arr2 = Arrays.copyOf(arr, arr.length);
int[] arr3 = Arrays.copyOf(arr, 3);
int[] arr4 = Arrays.copyOf(arr, 7);
int[] arr5 = Arrays.copyOfRange(arr,2, 4);
int[] arr6 = Arrays.copyOfRange(arr, 0, 7);
System.out.println("arr2 = " + Arrays.toString(arr2));
System.out.println("arr3 = " + Arrays.toString(arr3));
System.out.println("arr4 = " + Arrays.toString(arr4));
System.out.println("arr5 = " + Arrays.toString(arr5));
System.out.println("arr6 = " + Arrays.toString(arr6));
int[] arr7 = new int[5];
Arrays.fill(arr7, 9);
System.out.println("arr7 = " + Arrays.toString(arr7));
Arrays.setAll(arr7, i -> (int)(Math.random() * 6) + 1);
System.out.println("arr7 = " + Arrays.toString(arr7));
for (int i : arr7) {
char[] graph = new char[i];
Arrays.fill(graph, '*');
System.out.println(new String(graph) + i);
}
String[][] str2D = new String[][] {{"aaa", "bbb"}, {"AAA", "BBB"}};
String[][] str2D2 = new String[][] {{"aaa", "bbb"}, {"AAA", "BBB"}};
System.out.println(Arrays.equals(str2D, str2D2));
System.out.println(Arrays.deepEquals(str2D, str2D2));
char[] chArr = {'A', 'B', 'C', 'B', 'E'};
System.out.println("chArr = " + Arrays.toString(chArr));
System.out.println("index of B = " + Arrays.binarySearch(chArr, 'B'));
System.out.println("=== After sorting ===");
Arrays.sort(chArr);
System.out.println("chArr = " + Arrays.toString(chArr));
System.out.println("index of B = " + Arrays.binarySearch(chArr, 'B'));
}
}
실행결과
arr = [0, 1, 2, 3, 4]
arr2D = [[11, 12, 13], [21, 22, 23]]
arr2 = [0, 1, 2, 3, 4]
arr3 = [0, 1, 2]
arr4 = [0, 1, 2, 3, 4, 0, 0]
arr5 = [2, 3]
arr6 = [0, 1, 2, 3, 4, 0, 0]
arr7 = [9, 9, 9, 9, 9]
arr7 = [6, 1, 1, 5, 6]
******6
*1
*1
*****5
******6
false
true
chArr = [A, B, C, B, E]
index of B = 1
=== After sorting ===
chArr = [A, B, B, C, E]
index of B = 2
7. Comparator와 Comparable
Arrays.sort( )를 호출하면 Character클래스의 Comparable의 구현에 의해 정렬되었다. Comparator와 Comparable은 인터페이스로 컬렉션을 오름차순으로 정렬하는 데 필요한 메서드를 정의하고 있다.
Comparator의 메서드 compare( )와 Comparable의 메서드 compareTo( )는 선언형태와 이름만 다를 뿐 두 객체를 비교한다는 같은 기능이 있다. compareTo( )의 반환값은 int지만 두 객체가 같으면 0, 비교하는 값보다 작으면 -1, 크면 1을 반환한다. compare( )도 마찬가지다.
Comparator를 구현해서 정렬기준을 바꿀 수 있다.
Comparable 기본 정렬기준을 구현하는 데 사용 (오름차순)
Comparator 다른 기준으로 정렬할 때 사용
예제/ComparatorEx.java
import java.util.*;
public class ComparatorEx {
public static void main(String[] args) {
String[] strArr = {"cat", "Dog", "lion", "tiger"};
Arrays.sort(strArr); // String의 Comparable구현에 의한 정렬
System.out.println("strArr = " + Arrays.toString(strArr));
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); // 대소문자 구분안함
System.out.println("strArr = " + Arrays.toString(strArr));
Arrays.sort(strArr, new Descending()); // 역순 정렬
System.out.println("strArr = " + Arrays.toString(strArr));
}
}
class Descending implements 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;
}
}
실행결과
strArr = [Dog, cat, lion, tiger]
strArr = [cat, Dog, lion, tiger]
strArr = [tiger, lion, cat, Dog]
String의 Comparable구현은 문자열의 '오름차순 정렬(공백, 숫자, 대문자, 소문자)'되도록 작성되었다.
String의 정렬방식을 내림차순으로 하는 방법은 String에 구현된 compareTo( )의 결과에 -1을 곱해도 되고, 비교하는 객체의 위치를 바꿔서 c2.compareTo(c1)로 해도 된다.
다만 주의할 점은 compare( )의 매개변수가 Object타입이기 때문에 compareTo( )를 바로 호출할 수 없으므로 형변환해야 한다는 것이다.
출처 | Java의 정석 (남궁 성)
'💠프로그래밍 언어 > Java' 카테고리의 다른 글
[기본 개념] 6 | (1.8) TreeSet (0) | 2021.12.03 |
---|---|
[기본 개념] 6 | (1.7) HashSet (0) | 2021.12.03 |
[기본 개념] 6 | (1.5) Iterator, ListIterator, Enumeration (0) | 2021.12.03 |
[기본 개념] 6 | (1.4) Stack, Queue (0) | 2021.12.02 |
[기본 개념] 6 | (1.3) LinkedList (0) | 2021.12.02 |