본문으로 바로가기

1. Comparator과 Comparable

Comparator과 Comparable은 인터페이스입니다.

 

정렬에 필요한 메서드를 정의하고 있습니다.

 

Comparable을 구현하는 클래스는 Wrapper클래스와 String Date File등 입니다.

 

Comparable은 compareTo 메서드를 오버라이드 해야하고 

Comparator은 compare, equals를 오버라이드 합니다.

 

  • Comparable: 기본 정렬 기준 구현(기본적 오름차순)
  • Comparator: 직접 정렬 기준을 사용
public interface Comparable {
  // 같으면 0 , 작으면 음수, 크면 양수
  int compareTo(Object o);
}
public interface Comparator {
	// 같으면 0, 작으면 음수, 크면 양수
	int compare(Object o1, Object o2);
	boolean equals(Object obj);
}

2. 예제

public class ComparatorEx {
    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 {
    public int compare(Object o1, Object o2) {
        if (o1 instanceof Comparable && o2 instanceof Comparable) {
            Comparable c1 = (Comparable) o1;
            Comparable c2 = (Comparable) o2;
            // return c2.compareTo(c1);     // 역순 정렬
            return c1.compareTo(c2) * -1;   // 역순 정렬
        }
        return -1;
    }
}

Array.sort()는 Comparator를 구현한 클래스를 정의하지 않을 경우 Comparable을 통해 정렬됩니다.

 

  • Arrays.sort(Object): Comparable 정렬
  • Arrays.sort(Object, Comparator): 정의한 Comparator를 구현한 클래스 기반 정렬