본문 바로가기
코딩테스트/정렬

Comparator, Lamda 사용하여 2차원 배열 정렬하기

by asdft 2024. 2. 20.

2차원 배열을 바로 Arrray.sort()를 통해 정렬하려고 하면 java.lang.ClassCastException: I cannot be cast to java.lang.Comparable 오류가 발생합니다.

 

원인은 비교 기준이 구현되어 있지 않기 때문에 캐스팅에 실패했기 때문이라 아래와 같이 Comparable,Comparator 인터페이스를 구현하여 정렬기준을 추가해 줘야 합니다. 2차원배열 뿐만 아니라 객체비교할 때도 동일한 유사하니 참고해주세요.

 

1. Comparator 익명 클래스 구현

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

// 1. Comparator 익명 클래스 구현
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}
    }
});

// 다중 조건 
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}
    }
});

 

전통적으로 사용하던 Comparator 익명클래스 구현하는 방법입니다.

compare() 메서드를 오버라이드하여 원하는 정렬 기준을 명시해 줍니다.

오름차순, 내림차순 외에 원하는 조건으로도 구현이 가능하며 2차원 배열 뿐만 아니라 비교 가능한 모든 클래스에서 사용 가능합니다.

 

2. Lambda 사용 - Java 8이상

int[][] arr = new int[][]{{5,40},{3,50},{1,30},{4,20},{2,10}};
// 2. Lambda 사용 - Java 8이상
Arrays.sort(arr, (o1, o2) -> 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() 

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}

// ex)PriorityQueue<int[]> checkout = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));
// 2차원 배열을 두번째 숫자 기준으로 오름차순 정렬


Arrays.sort(arr, Comparator.comparingInt((int[] o) -> o[1]).reversed()); 
// 두번째 숫자 기준 내림차순 : {3,50}{5,40}{1,30}{4,20}{2,10}

 

Comparator의 comparing 메서드를 이용하는 방법입니다. 예제는 int타입이기 때문에 comparingInt 메서드가 사용되었습니다.

다중 조건으로 정렬하려면 메서드 체이닝(Method Chaining) 통해 정렬해 나가면 됩니다.

 
[참고]

'코딩테스트 > 정렬' 카테고리의 다른 글

Arrays.sort( ) - String 타입 / Integer 타입  (0) 2024.02.15
배열(Arrays)의 효율적인 사용  (1) 2024.02.07