Java를 활용하여 Array, List에 저장된 값들을 정렬할 때 가장 많이 쓰는 방식은 Arrays 클래스에 구현돼있는 sort() 함수를 이용하는 것이다. sort 함수는 정렬 방식 중 가장 시간 복잡도가 작은 방식으로 최적화돼있기 때문에 따로 정렬 방식을 구현할 필요 없이 손쉽게 사용하면 된다. 하지만 Arrays.sort()를 사용하면 무조건 오름차순으로만 정렬하고 이차원 배열 등 다차원 배열에서는 정렬이 되지 않는다. 이런 경우에 Comparator 인터페이스를 이용하여 정렬 기준을 오버라이드할 수 있다. 이를 활용하면 Array나 List의 정렬, 다차원 배열 정렬도 손쉽게 할 수 있다.
사용법
Arrays.sort()나 Collections.sort()를 이용하여 기존의 정렬방식과 동일하게 정렬하는 code를 작성하고, 정렬하려는 Array와 List 옆에 , 후 new Comparator를 선언한다. Comparator를 선언하게 되면 어떤 Generic type을 사용할지 정해주게 되어있고, 그 type에 해당하는 정렬을 새로 정의할 수 있다.
정렬을 정의하는 부분은 compare 함수 부분에 들어가게 된다. 이때 기준이 되는 부분을 함수의 parameter로 받게 되는데 '비교'하는 것이기 때문에 parameter는 항상 두 개씩 받게 되어있다. 앞에 오는 것이 배열에서 선순위에 존재하는 값이고, 뒤에 오는 값은 자료구조 내에서 그 다음에 존재하는 값이 된다.
parameter를 int로 가정한다면 앞의 값에서 뒤의 값을 뺀다고 했을 때 앞의 값이 더 크다면 그 차는 양수가 될 것이고, 작다면 음수가 될 것이다. Comparator는 기본적으로 오름차순이기 때문에 그 원리를 적용해본다면 순서를 변경하고자 한다면 양수를 return시키고, 순서를 그대로 놔두고 싶다면 음수를 return시키면 되는 것이다.
이 방식을 응용하여 value를 비교한 후 return 시키는 값을 조정하는 식으로 Comparator가 재정의하면 되고, value를 어떻게든 비교할 수만 있다면 어떠한 자료가 담겨있든 정렬이 가능해지는 것이다.
Comparator를 이용해 int형 2차원 배열을 정렬하는법
1
2
3
4
5
6
7
8
9
10
|
// 0번째 행렬로 정렬
Arrays.sort(array, new Comparator<int[]>() {
// Override된 compare 함수를 어떻게 정의하냐에 따라서 다양한 정렬이 가능함
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
// 내림자순 정렬을 하고 싶다면 o2와 o1의 위치를 바꿔줌
// return o2[0] - o1[0];
}
});
|
cs |
또한 Double형 2차원 배열도 아래와 같은 방법으로 정렬이 가능하다.
1
2
3
4
5
|
Arrays.sort(array, new Comparator<double[]>() {
public int compare(double[] o1, double[] o2) {
return Double.compare(o1[0], o2[0]);
}
});
|
cs |
자바8 람다식을 활용하면 아래와 같이 코드를 축약할 수 있다.
1
|
Arrays.sort(array, (o1, o2) -> Double.compare(o1[0], o2[0]));
|
cs |
'Study > java' 카테고리의 다른 글
람다 표현식(Lambda Experessions) 정리 (3) | 2021.02.08 |
---|---|
함수형 인터페이스(Functional Interface) 정리 (0) | 2021.02.08 |
(펌)Java8 Optional 의 ifPresent 활용 (0) | 2020.10.04 |
Java Stream(2) - 가공하기 및 결과 만들기 (0) | 2020.07.26 |
Java Stream(1) - 기본 개념 및 생성하기 (0) | 2020.07.22 |