[Java] Interface Comparator and Comparable

Java

Language :

Collection Framework

데이터 군을 저장하는 클래스들을 표준화한 설계

컬렉션 Collection :  다수의 데이터. 데이터 그룹

프레임웍 Framework :  표준화된 프로그래밍 방식.

Comparator and Comparable

컬렉션을 정렬하는 데 필요한 메서드를 정의하고 있는 인터페이스.

Comparable을 구현한 클래스는 정렬이 가능하다.

java.util.Comparator<T>

기본 정렬 기준 외에 다른 기준으로 정렬하고 싶을 때 사용한다.

public interface Comparator<T> {
    int compare(T o1, T o2);
    ...
}

구현할 때 equals()를 오버라이딩할 필요가 있을 수 있다.

java.lang.Comparable<T>

기본 정렬 기준을 구현하는 데 사용한다.

public interface Comparable<T>{
    public int compareTo(T o);
}

구현 클래스들은 기본적으로 오름차순으로 정렬되어 있다.

내림차순이나 다른 기준에 의해서 정렬되도록 하고 싶을 때는 Comparator를 구현해서 정렬 기준을 제공할 수 있다.

compare() & compareTo()

두 객체를 비교한다.

같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환하도록 구현해야 한다.

public final class Integer extends Number implements Comparable<Integer> {
    ...
    public int compareTo(Integer anotherInteger) {
        return compare(this.value, anotherInteger.value);
    }

    public static int compare(int x, int y) {
        // 비교하는 값이 크면 -1, 같으면 0, 작으면 1을 반환
	return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }
}

Arrays.sort()

배열을 정렬할 때, Comparator를 지정해주지 않으면 저장하는 객체에 구현된 내용에 따라 정렬된다.

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

String

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

문자열의 오름차순 정렬은 공백, 대문자, 소문자 순으로, 문자의 유니코드의 순서가 작은 값에서부터 큰 값으로 정렬된다.

  • 대소문자 구분 없이 정렬
public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
  • 내림차순 정렬

    String에 구현된 compareTo() 결과에 -1을 곱한다.

public class Test implements Comparator {
    @Override
    public int compare(Object o1, Object o2) {
        if (o1 instanceof Comparable && o2 instanceof Comparable) {
            Comparable c1 = (Comparable) o1;
            Comparable c2 = (Comparable) o2;
            return c1.compareTo(c2) * -1;
        }
        return -1;
    }
}

Comparator API

Comparable API

참고 서적: 자바의 정석 3판 2

민갤

Back-End Developer

백엔드 개발자입니다.