Ch11-25~29. Arrays의 메서드
0. 목차
Chapter11. 컬렉션 프레임웍
Ch11 - 25. Arrays의 메서드(1) : 복사
Ch11 - 26. Arrays의 메서드(2) : 채우기, 정렬, 검색
Ch11 - 27. Arrays의 메서드(3) : 비교와 출력
Ch11 - 28. Arrays의 메서드(4) : 변환
Ch11 - 29. Arrays의 메서드 예제
Ch11 - 25. Arrays의 메서드(1) : 복사
▶ Arrays class란?
▷ 배열을 다루기 편리한 메서드(static) 제공
- Arrays class의 모든 메서드 = static
- Arrays class의 모든 메서드 = util 메서드
- Arrays class와 비슷한 클래스 : Objects, Collections, Math…
▶ Arrays class : 배열의 출력 toString()
▷ static String toString(boolean[] a)
[a, b, c, d] -toString→ "[a, b, c, d]"
: 오버로딩
▷ static String toString(byte[] a)
▷ static String toString(char[] a)
▷ static String toString(shor[] a)
▷ static String toString(int[] a)
▷ static String toString(long[] a)
▷ static String toString(float[] a)
▷ static String toString(double[] a)
▷ static String toString(Object[] a)
▶ Arrays class : 배열의 복사 copyOf()
copyOfRange()
▷ copyOf()
copyOfRange()
= 새로운 배열을 생성 후 반환
int[] arr = {0, 1, 2, 3, 4}
▷ int[] arr2 = Arrays.copyOf(arr, arr.length)
arr
의arr[0~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)
2 ≤ 범위 < 4
arr5 = [2, 3]
▷ int[] arr6 = Arrays.copyOfRange(arr, 0, 7)
0 ≤ 범위 < 7
arr6 = [0, 1, 2, 3, 4, 0, 0]
Ch11 - 26. Arrays의 메서드(2) : 채우기, 정렬, 검색
▶ Arrays class : 배열 채우기 fill()
setAll()
int[] arr = new int[5];
▷ Arrays.fill(arr, 9);
arr = [9, 9, 9, 9, 9]
▷ Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1);
- 람다식, 난수(1 ≤ 범위 < 6)
arr = [1, 5, 2, 1, 1]
▶ Arrays class : 배열 정렬과 검색 sort()
binarySearch()
int[] arr = {3, 2, 0, 1, 4};
▷ int idx = Arrays.binarySearch(arr, 2;);
binarySearch()
정렬 된 배열에만 사용 가능- 2의 위치를 찾는 것
idx = -5
arr[1]에 2 있는데 왜 에러? → 배열 정렬 안 되어 있음
binarySearch()
=sort()
로 배열 정렬 후 사용!
▷ Arrays.sort(arr);
→ int idx = Arrays.binarySearch(arr, 2);
- 배열 arr을 정렬
[0, 1, 2, 3, 4]
idx = 2
arr[2]에 2가 있음
▶ 순차 검색 vs 이진 검색
[7, 1, 6, 9, 5, 3, 8, 4, 10, 2]
▷ 순차 검색
7 → 1 → 6 → 9 → 5 → 3 → 8 → 4 → 10 → 2
- 10개 요소에서 1개 찾으려면 몇 번 뒤져야 하나?
- 평균 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 / 10 = 5.5회
▷ 이진 검색(이분 검색, binarySearch)
-
정렬 먼저 시킴
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- 반으로 쪼갬1
[1, 2, 3, 4, 5] |10 > 5| [6, 7, 8, 9, 10]
[1, 2, 3, 4, 5]
|10 > 5| [6, 7, 8, 9, 10]
- 5보다 작은 쪽은 볼 필요 없음
- 반으로 쪼갬2
[6, 7, 8] |10 > 8| [9, 10]
[6, 7, 8]
|10 > 8| [9, 10]
- 8보다 작은 쪽은 볼 필요 없음
[9, 10]
[10]
- 평균 3 ~ 4회 뒤지면 요소 찾음
- 정렬을 해야만 한다는 것이 단점
Ch11 - 27. Arrays의 메서드(3) : 비교와 출력
▶ Arrays class : 다차원 배열의 출력 deepToString()
int[] arr = {0, 1, 2, 3, 4}; // 1차원 배열
int[] arr2D = { {11, 12}, {21, 22} }; // 2차원 배열
▷ System.out.println(Arrays.toString(arr));
[0, 1, 2, 3, 4]
- 1차원 배열 출력
▷ System.out.println(Arrays.deepToString(arr2D));
[11, 12], [21, 22]
- 2차원 배열 출력
▶ Arrays class : 다차원 배열의 비교 deepEquals()
String[] str2D = new String[][]{ {"aaa", "bbb"}, {"AAA", "BBB"} };
String[] str2D2 = new String[][]{ {"aaa", "bbb"}, {"AAA", "BBB"} };
▷ System.out.println(Arrays.equals(str2D, str2D2));
- 1차원 배열 비교
false // 잘못된 결과
▷ System.out.println(Arrays.deepEquals(str2D, str2D2));
- 다차원 배열 비교
true
Ch11 - 28. Arrays의 메서드(4) : 변환
▶ Arrays class : 배열을 List로 변환 asList(Object... a)
List list = Arrays.asList(new Integer[]{1, 2, 3, 4, 5});
List list = Arrays.asList(1, 2, 3, 4, 5);
▷ asList(Object... a)
(Object... a)
: 가변 매개변수- List 특징 : 읽기 전용
▷ list.add(6);
- UnsupportedOperationException 발생
▷ List list = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));
- 새로운 ArrayList를 만듦
Ch11 - 29. Arrays의 메서드 예제
▶ 다차원 출력 Arrays.deepToString()
▷ Arrays.toString(arr)
▷ Arrays.deepToString(arr2D)
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));
// console
arr : [0, 1, 2, 3, 4]
arr2D : [[11, 12, 13], [21, 22, 23]]
▶ 배열 복사 copyOf()
copyOfRange()
▷ Arrays.copyOf(arr, arr.length)
▷ Arrays.copyOf(arr, 3)
▷ Arrays.copyOf(arr, 7)
▷ Arrays.copyOf(arr, 2, 4)
▷ Arrays.copyOf(arr, 0, 7)
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); // 2 ≤ 범위 < 4
int[] arr6 = Arrays.copyOfRange(arr, 0, 7); // 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));
// console
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]
▶ 배열 채우기 fill()
setAll()
▷ Arrays.fill(arr7, 9)
int[] arr7 = new int[5];
Arrays.fill(arr7, 9);
System.out.println("arr7 : " + Arrays.toString(arr7));
// console
arr7 : [9, 9, 9, 9, 9]
▷ Arrays.fill(arr7, 9)
Arrays.setAll(arr7, i -> (int)(Math.random()*6)+1); // 람다식
System.out.println("arr7 : " + Arrays.toString(arr7));
// console
arr7 : [1, 2, 4, 2, 2]
▶ 향상 된 for문 for (int i : arr) { }
+ fill()
▷ for (int i : arr7) { }
for (int i : arr7) { }
// 풀어쓰면
for (int x = 0; x < arr7.length; x++) {
int i = arr7[x];
}
▷ for (int i : arr7) { }
+ fill()
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);
}
// console
arr7 : [5, 1, 3, 6, 5]
♡♡♡♡♡5
♡1
♡♡♡3
♡♡♡♡♡♡6
♡♡♡♡♡5
▶ 다차원 배열 비교 deepEquals()
String[][] str2D = new String[][]{ {"aaa","bbb"}, {"AAA","BBB"} };
String[][] str2D2 = new String[][]{ {"aaa","bbb"}, {"AAA","BBB"} };
▷ Arrays.deepEquals(str2D, str2D2)
System.out.println(Arrays.equals(str2D, str2D2));
System.out.println(Arrays.deepEquals(str2D, str2D2));
// console
false // 잘못된 결과, 다차원 배열은 equals() 안됨
true
▶ 이분 검색 binarySearch()
char[] chArr = { 'A', 'D', 'C', 'B', 'E' };
▷ binarySearch()
전 반드시! Arrays.sort(chArr);
정렬!!
▷ Arrays.binarySearch(chArr, 'B')
Arrays.sort(chArr);
System.out.println("chArr : " + Arrays.toString(chArr));
System.out.println("index of B : " + Arrays.binarySearch(chArr, 'B'));
// console
chArr : [A, B, C, D, E]
index of B : 1 // chArr[1]에 B가 있다는 것