본문 바로가기
Study/java

Comparator를 이용한 Array와 List의 정렬

by 유경호 2020. 7. 3.
반응형

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

 

 

 

반응형