= 알고리즘을 보통 풀 때 정렬 또는 역정렬이 필요할떄 무작정 sort() 함수를 쓰는데 구현 부를 보니 comparator, comparable 과 같은 처음보는 클래스가 있어서 한번 찾아 보게 되었다. 아무래도 무작정 메서드를 쓰는 것 보다는 어떤 식으로 동작하는지 알아보는게 좋다고 생각해서 알아보게 되었다.
Collerctions.sort 또는 Arrays.sort()를 호출만 하면 컴퓨터가 알아서 배열을 정렬하는 것이 아닌 Character 클래스의 Comparable의 구현 에 의해 정렬이 되는 것이다.먼저 Comparator 와 Comparable 이 어떤식으로 구혀되어 있는지 코드를 보고 분석해보자
public interface Comparator{
int compare(Object o1, Object o2);
boolean(equals(Object obj);
}
=> Comparator의 경우는 java.lang 패키지에 있다.
public interface Comparable{
public int compareTo(Object o);
}
=> Comparable 의 경우는 java.util 패키지에 있다.
compare() 와 compareTo()는 선언형태와 이름이 약간 다를 뿐 두 객체를 비교한다는 같은 기능을 목적으로 고안됨.
compareTo()의 경우 반환 값은 int이지만 실제로는 비교한는 두 객체가 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수 중의 하나를 반환하도록 구현해야 한다.
public final class Integer extends Number implements Comparable{
...
public int compareTo(Object o){
return compareTo((Integer)o);
}
public int compareTo(Integer anotherInteger){
int thisVal = this.value;
int anotherVal = anotherInteger.value;
}
return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));
}
...
}
Integer 클래스의 일부로서 Camparable 의 compareTo(Object o)를 구현해 놓은 것을 알 수 있는데, 이또한 CompareTo 메서드에 의한 것이ㅏ.
Comparable : 기본 정렬 기준을 구현하는데 사용
Comparator : 기본 정렬 기준 외에 다른 기준으로 정렬하고 싶을 때 사용
package ch11_collections_framework.comparator;
import java.util.Arrays;
import java.util.Comparator;
public class ComparatorEx01 {
public static void main(String[] args) {
String[] strArr = {"cat", "Dog", "lion", "tiger"};
Arrays.sort(strArr); // String의 Comparable 구현에 의한 정렬
System.out.println("strArr=" + Arrays.toString(strArr));
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); // 대소문자 구분 x
System.out.println("strArr=" + Arrays.toString(strArr));
Arrays.sort(strArr, new Descending());
System.out.println("strArr=" + Arrays.toString(strArr));
}
}
class Descending implements Comparator { // 사용자 정의 Comparator
public int compare(Object o1, Object o2) { // 오버라이딩 필수
if (o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable) o1;
Comparable c2 = (Comparable) o2;
// Comparable 로 형변환
return c1.compareTo(c2) * -1; // 기본 정렬방식의 역으로 변경한다.
// c2.compareTo(c1) * -1 과 같이 해도 된다.
}
return -1; //
}
}
위는 기본적인
1 - comparable 에 의해 구현된 정렬
2 - String 에서 제공하는 comparator 에 의해 구현된 정렬 (아래 이미지)
3 - 사용자 정의 comparator를 구현
코드 3 설명 : 해당 객체가 Comparable 에 속하거나 상속받기가 가능한 경우 해당 객체를 Comparable 로 형변환을 하여 해당 값을 부호를 바꾸서 리턴 하도록 구현함

결과 :

(정상 정렬, 대소문자 무시 정렬, 역순 정렬이 된 것을 확인 가능)
참고하면 좋은 블로그 : https://dding9code.tistory.com/68