티스토리 뷰
오랜만이네요. 자주오도록 해볼게요.
---
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]));
}
}
이캐 할 수 있다.
출력은 아래와 같다.
'프로그래밍 > JAVA' 카테고리의 다른 글
JAVA (Eclipse) .jar 소스보기 Source Attachment (0) | 2019.07.25 |
---|---|
JAVA print, printf, println 차이점 (0) | 2019.07.24 |
JAVA next(), nextLine() 차이점 (0) | 2019.07.10 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday