[Java] Interface Comparator and Comparable
JavaCollection 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;
}
}
참고 서적: 자바의 정석 3판 2