public interface Comparator {
int compare(Object o1, Object o2); // o1, o2 두 객체를 비교
}
public interface Comparable {
int compareTo(Object o); // 주어진 객체(o)를 자신(this)과 비교
}
compare()와 compareTo()는 두 객체의 비교결과를 반환하도록 작성한다.
위 메서드들을 호출하여 결과가 0, 음수, 양수인 지에 따라서 자리바꿈 유무를 정해준다. (=> 정렬기준)
두 객체가 같으면 0
오른쪽이 크면 음수 (-)
왼쪽이 크면 양수 (+)
해당 객체와 매개변수로 넘어온 객체를 비교한다.
Arrays.sort()와 같은 메서드가 정렬을 수행하는 과정에서compareTo()를 호출한다.
// Comparable은 기본 정렬 기준을 제공
public final class Integer extends Number implements Comparable {
public int compareTo(Inreger anotherInteger) {
int thisVal = this.value;
int anotherVal = anotherInteger.value;
// 비교하는 값이 크면 -1, 같으면 0, 작으면 1을 반환
return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1))
}
}
예제
String[] strArr = {"cat", "Dog", "lion", "tiger"};
// String 클래스의 Comparable 구현에 의한 정렬 => compareTo() 구현 => 기본 정렬 기준 (사전순)
Arrays.sort(strArr);
// 대소문자 구분 안 함
Arrays.sort(strArr, String.CASE_INSENSIITIVE_ORDER);
// 역순 정렬
Arrays.sort(strArr, new Descending());
class Descending implements Comparator {
public int compare(Object o1, Object o2){
if( o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable)o1;
Comparable c2 = (Comparable)o2;
// -1을 곱해서 기본 정렬방식의 역으로 변경
// 또는 c2.compareTo(c1)와 같이 순서를 바꿔도 된다.
return c1.compareTo(c2) * -1 ;
}
return -1;
}
}