알고리즘 문제를 풀거나 할 때 코드내에서 배열을 정렬해야 하는 상황이 온다.
자바에서 배열 정렬은 다음과 같이 간단하게 할 수 있다.
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 해준다. 저 방향을 뒤집으면 내림차순 정렬이된다.
결과
끝!
'Java' 카테고리의 다른 글
[JAVA] PriorityQueue in Java (0) | 2019.12.21 |
---|---|
[Java] Java 에는 pair(c++) 가 외없데? (0) | 2019.12.19 |
[OOP] 책임과 역할의 차이 그리고 타입의 구현 방법 (0) | 2019.12.15 |
[OOP] 객체, 추상화, 캡슐화 (0) | 2019.12.14 |
[의존성과 아키텍처] 조영호작가님의 우아한 객체지향 강의 후기 및 정리 (1) | 2019.12.09 |