2차원 배열은 어떻게 정렬할까?

Daniel·2024년 5월 21일
1

Back-End

목록 보기
38/42

들어가며

알고리즘 풀던 도중 2차원 배열을 정렬해야하는 로직을 작성 중
무의식 적으로 Array.sort(A) 메서드에 바로 집어 넣었더니 java.lang.ClassCastException: I cannot be cast to java.lang.Comparable 오류가 발생했습니다.

이에따라 2차원 배열을 정렬하려면 어떻게 해야 하는지 정리하고 넘어가려 합니다.

어떻게 할까요?

2차원 배열 뿐만 아니라 객체끼리 비교할 때는 Comparable, Comparator 인터페이스를 구현하여 정렬 수행 방법 을 정의해야 합니다.

1. Compartor 익명 클래스 구현

int[][] arr = new int[][]{{5,40},{3,50},{1,30},{4,20},{2,10}};

// 1. Comparator 익명 클래스 구현
// - 반환 : 첫 번째 개체는 두 번째 앞에 와야 합니다.  
// 0 반환 : 두 객체의 순서는 동일 (그대로)  
// + 반환 : 첫 번째 개체는 두 번째 뒤에 와야 합니다.
Arrays.sort(arr, new Comparator<int[]>() {
    @Override
    public int compare(int[] o1, int[] o2) {
        return o1[0]-o2[0]; // 첫번째 숫자 기준 오름차순 {1,30}{2,10}{3,50}{4,20}{5,40}
        //return o2[0]-o1[0]; // 첫번째 숫자 기준 내림차순 {5,40}{4,20}{3,50}{2,10}{1,30}
        //return o1[1]-o2[1]; // 두번째 숫자 기준 오름차순 {2,10}{4,20}{1,30}{5,40}{3,50}
        //return o2[1]-o1[1]; // 두번째 숫자 기준 내림차순 {3,50}{5,40}{1,30}{4,20}{2,10}
    }
});

// 다중 조건 
// - 반환 : 첫 번째 개체는 두 번째 앞에 와야 합니다.  
// 0 반환 : 두 객체의 순서는 동일 (그대로)  
// + 반환 : 첫 번째 개체는 두 번째 뒤에 와야 합니다.
int[][] arr2 = new int[][]{{5,40},{3,50},{1,30},{4,20},{2,10},{6,40},{6,50},{6,10},{6,20},{6,30}};

Arrays.sort(arr2, new Comparator<int[]>() { 
    @Override
    public int compare(int[] o1, int[] o2) {
        return o1[0]!=o2[0] ? o1[0]-o2[0] : o1[1]-o2[1]; // 첫번째 기준 오름차순 > 두번째 기준 오름차순  : {1,30}{2,10}{3,50}{4,20}{5,40}{6,10}{6,20}{6,30}{6,40}{6,50}
        //return o1[0]!=o2[0] ? o1[0]-o2[0] : o2[1]-o1[1]; // 첫번째 기준 오름차순 > 두번째 기준 내림차순  : {1,30}{2,10}{3,50}{4,20}{5,40}{6,50}{6,40}{6,30}{6,20}{6,10}
    }
});

2. Lambda 사용

int[][] arr = new int[][]{{5,40},{3,50},{1,30},{4,20},{2,10}};

// 2. Lambda 사용 - Java 8이상
// - 반환 : 첫 번째 개체는 두 번째 앞에 와야 합니다.  
// 0 반환 : 두 객체의 순서는 동일 (그대로)  
// + 반환 : 첫 번째 개체는 두 번째 뒤에 와야 합니다.
Arrays.sort(arr, (o1, o2) -> {
    return o1[0]-o2[0]; // 첫번째 숫자 기준 오름차순 {1,30}{2,10}{3,50}{4,20}{5,40}
});

3. Comparator.comparing() 사용

int[][] arr = new int[][]{{5,40},{3,50},{1,30},{4,20},{2,10}};

// 3.  Comparator.comparing() 
// - 반환 : 첫 번째 개체는 두 번째 앞에 와야 합니다.  
// 0 반환 : 두 객체의 순서는 동일 (그대로)  
// + 반환 : 첫 번째 개체는 두 번째 뒤에 와야 합니다.
Arrays.sort(arr, Comparator.comparingInt((int[] o) -> o[0]));            // 첫번째 숫자 기준 오름차순 : {1,30}{2,10}{3,50}{4,20}{5,40}
Arrays.sort(arr, Comparator.comparingInt((int[] o) -> o[0]).reversed()); // 첫번째 숫자 기준 내림차순 : {5,40}{4,20}{3,50}{2,10}{1,30}
Arrays.sort(arr, Comparator.comparingInt((int[] o) -> o[1]));            // 두번째 숫자 기준 오름차순 : {2,10}{4,20}{1,30}{5,40}{3,50}
Arrays.sort(arr, Comparator.comparingInt((int[] o) -> o[1]).reversed()); // 두번째 숫자 기준 내림차순 : {3,50}{5,40}{1,30}{4,20}{2,10}
profile
응애 나 애기 개발자

0개의 댓글