[Java] Comparator, Comparable

Ik·2023년 9월 13일
0

Back

목록 보기
28/33

개요

Comparator, Comparable 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의할 수 있으며 두 객체 모두 비교한다는 같은 기능을 목적으로 고안된 것

차이점은 Comparable은 기본 정렬 기준을 구현하는데 사용하며 Comparator은 기본 정렬 기준 외에 다른 기준으로 정렬하고자 할 때 사용한다

  • ex) String의 Comparable구현은 문자열이 사전 순으로 정렬되도록 작성되어 있다

public interface Comparator {
	int compare(Object o1, Object o2);
}

public interface Comparable {
	int compareTo(Object o);
}

Comparable의 대상은 주로 Integer와 같은 wrapper 클래스, String, Date, File과 같은 것들로 오름차순으로 구현되어 있으며 기본 정렬 기준을 구현하는데 사용된다.




Array.sort() Comparator

static void sort(Object[] a)	// 객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬
static void sort(Object[] a, Comparator c)	// 지정한 Comparator에 의한 정렬

예를 들어 2차원 배열의 경우 Arrays.sort() 메서드를 사용할 수 없다. 하지만 Comparator를 이용해 정렬을 할 수 있는데

import java.util.*;

public class Main {
    public static void main(String[] args){

        int[][] arr = {
                {3, 4}
                ,{6, 1}
                ,{6, 4}
                ,{2, 123}
                ,{77, 342}
                };

        Arrays.sort(arr, new Comparator<int[]>(){
            public int compare(int[] o1, int[] o2){
                if (o1[0] == o2[0]) {
                    return o1[1] - o2[1];
                }
                return o1[0] - o2[0];
            }
        });

        System.out.println(Arrays.deepToString(arr));	// [[2, 123], [3, 4], [6, 1], [6, 4], [77, 342]]

    }
}

해당 작업은 첫번째 인덱스를 기준으로 오름차순으로 정렬하되 인덱스가 같은 경우 두번째 인덱스 오름차순 기준으로 정렬한 것이다

보다 간단하게 코드를 짠다면 밑과 같이 짤 수 있다

import java.util.Arrays;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {

        int[][] arr = {{7, 8}, {9, 7}, {1, 3}, {1, 1}, {4, 7}, {0, 4}, {-2, 4}, {0, 1}};

        Arrays.sort(arr, (o1, o2) -> o1[0] - o2[0] == 0 ? o1[1] - o2[1] : o1[0] - o2[0]);
        for(int[] a : arr) {
            System.out.println(Arrays.toString(a));
        }
    }
}

출력
[-2, 4]
[0, 1]
[0, 4]
[1, 1]
[1, 3]
[4, 7]
[7, 8]
[9, 7]






ref

0개의 댓글