티스토리 뷰

오랜만이네요. 자주오도록 해볼게요.

 

---

 

1차원 배열은 Arrays.sort(배열이름)으로 쉽게 정렬할 수 있다.

 

하지만 2차원 이상의 배열일 경우엔

public class sortTest {
	public static void main(String[] args) {
		int[][] arr = {{3,5},{2,7},{1,6}};
		
		Arrays.sort(arr);
	}
}

다음과 같은 Exception이 발생한다.

Exception in thread "main" java.lang.ClassCastException: class [I cannot be cast to class java.lang.Comparable ([I and java.lang.Comparable are in module java.base of loader 'bootstrap')
	at java.base/java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
	at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
	at java.base/java.util.Arrays.sort(Arrays.java:1250)
	at Test.sortTest.main(sortTest.java:9)

 

정렬에 들어가기 앞서, java.util.Arrays에서 정의된 sort 메소드 내용은 다음과 같다.

    public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }

    /** To be removed in a future release. */
    private static <T> void legacyMergeSort(T[] a, Comparator<? super T> c) {
        T[] aux = a.clone();
        if (c==null)
            mergeSort(aux, a, 0, a.length, 0);
        else
            mergeSort(aux, a, 0, a.length, 0, c);
    }

사실 무슨 내용인지는 잘 모르겠다. ㅎ

중요한건 원하는 대로 정렬 조건을 다르게 하려면 저기 있는 Comparator 클래스를 이용한다는 점

 

람다식을 사용해서 정렬해보면

public class sortTest {
	public static void main(String[] args) {
		int[][] arr = {{3,5},{2,7},{1,6}};
        
		// 정렬
		Arrays.sort(arr, (num1, num2) -> {
			return Integer.compare(num1[0], num2[0]);
		});
	}
}

이캐된다.

배열을 정렬할 때, 비교 요소를 첫 번째 요소로 정하겠다는 의미이다.

 

comparator에 내부 함수를 이용해서 더 간단하게도 가능하다.

 

 

Arrays.sort(arr, Comparator.comparingInt(num1 -> num1[0]));

좀더 간단쓰

출력 화면은 아래와 같음

무튼 이거를 활용해서 두 번째 요소를 정렬해보면

public class sortTest {
	public static void main(String[] args) {
		int[][] arr = {{3,5},{2,7},{1,6}};
        
		// 정렬 - (1)
		Arrays.sort(arr, (num1, num2) -> {
			return Integer.compare(num1[1], num2[1]);
		});
		// 정렬 - (2)
		Arrays.sort(arr, Comparator.comparingInt(num1 -> num1[1]));
	}
}

 

이캐 할 수 있다.

 

출력은 아래와 같다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday