JAVA/자바의 정석

[자바의 정석 - 기초편] 11. (4) Arrays / Comparator / Comparable

서영22 2023. 12. 11. 03:46

 Arrays 

배열을 다루기 편리한 메서드(static) 제공

 

1. 배열의 출력 - toString()

static String toString(byte[ ] a)

 

 

2. 배열의 복사 - 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, 7);                 // arr3 = [0, 1, 2, 3, 4, 0, 0]
int[ ] arr4 = Arrays.copyOfRange(arr, 2, 4);  // arr4 = [2, 3]

 

 

3. 배열 채우기 - 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);  // arr = [1, 5, 2, 1, 1]
(난수값 1<= x < 6)

 

 

4. 배열의 정렬과 검색 - sort(), binarySearch()

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 (올바른 결과)

 

 

5. 다차원 배열의 출력 - deepToString()

int[ ]    arr      = {0, 1 ,2, 3, 4};
int[ ][ ] arr2D = {{11, 12}, {21, 22}};

System.out.println(Arrays.toString(arr));   // [0, 1, 2, 3, 4]
System.out.println(Arrays.deepToString(arr2D));  // [[11. 12], [21, 22]]

 

 

6. 다차원 배열의 비교 - deepEquals()

String[ ][ ] str2D   = new String[ ][ ]{{"aaa", "bbb"}, {"AAA", "BBB"}};
String[ ][ ] str2D2 = new String[ ][ ]{{"aaa", "bbb"}, {"AAA", "BBB"}};

System.out.println(Arrays.deepEquals(str2D, str2D2));

 

 

7. 배열을 List로 변환 - asList(Object... a)

(읽기 전용)
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 예외 발생 (읽기 전용이라서 오류)

List list = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));  // 새로운 ArrayList 생성 (변경 가능)

 

 

8. 람다와 스트림 관련 - parallelXXX(), spliterator(), stream()

 

 

 

Comparable & Comparator 

객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스

 

- Comparable : 기본 정렬기준을 구현하는데 사용

- Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용

public interface Comparable {
        int compareTo(Object o);                 // 주어진 객체(o)를 자신(this)과 비교
}
public interface Comparator {
        int compare(Object o1, Object o2);  // o1, o2 두 객체를 비교
        boolean equals(Object obj);            // equals를 오버라이딩하라는 뜻
}

 

 

- compare() 와 compareTo()는 두 객체의 비교결과를 반환하도록 작성

   같으면 0, 오른쪽 값이 크면 음수(-1), 작으면 양수(+)

public final class Integer extends Number implements Comparable {
        ...
        public int compareTo(Integer anotherInteger) {
                int v1 = this.value;
                int v2 = anotherInteger.value;

                // 같으면 0, 오른쪽 값이 크면 -1, 작으면 1 반환
                return (v1 < v2 ? -1 : (v1 == v2 ? 0 : 1));
        }
        ...
}

 

 

< 예제 >

 

 

String 클래스가 기본적으로 Comparable을 구현하고 있음

 

 

 Integer와 Comparable 

public final class Integer extends Number implements Comparable {
        ...
        public int compareTo(Object o) {
                return compareTo((Integer) o);
        }
        public int compareTo(Integer anotherInteger) {
                int thisVal = this.value;
                int anotherVal = anotherInteger.value;

                // 같으면 0, 오른쪽 값이 크면 -1, 작으면 1 반환
                return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));
        }
        ...
}

 

 

< 버블 정렬 >

 

다 그대로 두고 정렬 기준만 정하면 됨