본문 바로가기

Java

[Java] Comparator와 Comparable 객체 정렬

Comparator와 Comparable

객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스

compare( )와 compareTo( )는 두 객체의 비교결과를 반환하도록 작성

같으면 0, 오른쪽이 크면 음수, 왼쪽이 크면 양수

public interface Comparable {
    int compareTo(Object o); // 주어진 객체(o)를 자신과 비교
}

public interface Comparator {
    int compare(Object o1, Object o2); // o1, o2 두 객체를 비교
    boolean equals(Object obj); // euquals를 오버라이딩 하라는 뜻
}

 

Comparable

 

기본 정렬 기준을 구현하는데 사용(디폴트)

 

 

Comparator

기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용

객체와 자기자신(this)와 비교

 

 

public class Ex1 {

    public static void main(String[] args) {
        String[] stArr = {"cat", "Dog", "lion", "tiger"};

        Arrays.sort(stArr); // String의 Comparable 구현에 의한 정렬(정렬 대상)
        System.out.println("stArr = " + Arrays.toString(stArr));

        Arrays.sort(stArr, String.CASE_INSENSITIVE_ORDER); // 대소문자 구분안함
        System.out.println("stArr = " + Arrays.toString(stArr));

        Arrays.sort(stArr, new Descending()); // 역순 정렬(정렬대상, 정렬기준)
        System.out.println("stArr = " + Arrays.toString(stArr));


    }
}

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 c1.compareTo(c2) * -1; // -1을 곱해서 기본 정렬방식의 역으로 변경한다.
          // return c2.compareTo(c1)       // 또는 c2.compareTo(c1)와 같이 순서를 바꿔도 된다.
        }
        return -1; // 비교할 수 없는 대상
    }
}
stArr = [Dog, cat, lion, tiger] // 기본정렬
stArr = [cat, Dog, lion, tiger] 
stArr = [tiger, lion, cat, Dog] // 기본정렬 역순

 

정렬기준을 정해주고 싶다면 Comparator를 구현한 클래스가 필요하다!

-1을 곱해 음수(-1)일 때는 양수가 되고 양수가 될 때는 음수(-1)이 된다.

따라서 역순으로 정렬이 된다.

 

static void sort(Object[] a); // 객체 배열에 저장된 객체가 구현한 Comparable 에 의한 정렬
static void sort(Object[] a, Comparator); // 지정한 Comparator에 의한 정렬

 

 

기본적으로 정렬을 하려면 대상정렬기준이 필요하다.

대상만 파라미터로 받는 메서드는 대상이 String 처럼 comparable이 구현되어 있어야 한다.