본문 바로가기


Java

[Java] 자바로 2차원 배열 2번째 element 까지 정렬하기, Comparator

알고리즘 문제를 풀거나 할 때 코드내에서 배열을 정렬해야 하는 상황이 온다.

자바에서 배열 정렬은 다음과 같이 간단하게 할 수 있다.

 

Arrays.sort(arr)

 

근데 만약에 저 array가 2차원이라면? exception 이 떨어진다.

 

java.lang.ClassCastException: [I cannot be cast to java.lang.Comparable
	at java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
	at java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
	at java.util.Arrays.sort(Arrays.java:1246)
	at Solution.merge(Solution.java:9)
	at Solution.main(Solution.java:17)

 

그래서 뒤에 compare 함수를 넣어줘야하는데 Comparator 라는 funtional interface 를 사용하면 편리하다.

다음과 같은 array 가 있다고 하자

 

int[][] arr = {{2,6}, {1,8}, {1,2}};

 

이 array 를 최종형태

{1,2}, {1,8}, {2,6} 로 만들고 싶다면? 여기저기 검색해서 나오는대로 일단 compare 를 간단하게 작성해본다.

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

 

이렇게 작성하면 뭔가 되는 것 처럼 보인다. 출력해보면

 

 

와! 된듯보이지만 2번째 element 가 마음에 들지 않는다. 저것도 정렬해주길 바란다면 comparator 함수를 조금 손보면 된다.

 

Arrays.sort(arr, (o1, o2) -> {
    if (o1[0] == o2[0]) {
        return Integer.compare(o1[1], o2[1]);
    } else {
        return Integer.compare(o1[0], o2[0]);
    }
});

 

이렇게! 첫번째 element 가 같으면 두번째 element 로 비교하라는 내용이다.

 

참고로 compare 는 두 파라미터를 비교해서 좌변이 크면 1 우변이 크면 -1 같으면 0 을 return 해준다. 저 방향을 뒤집으면 내림차순 정렬이된다.

 

결과

 

끝!