📚참고
컬렉션 프레임워크와 핵심 인터페이스

 

 

 

 

 

 

 

 

 

 

Comparator & Comparable

 

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

 

  • 정렬 방법 (불변)
    1. 1. 두 대상을 비교
    2. 2. 자리 바꿈
    3. 3. 1, 2번 반복
  • 정렬 기준 (가변)

 

  • Comparable : 기본 정렬기준을 구현하는데 사용
  • Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용

 

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;
	} 
}

 

 

 

 

 

 

 

 

 

 

'JAVA > 컬렉션 프레임워크' 카테고리의 다른 글

Set  (0) 2021.06.15
Arrays  (0) 2021.05.31
Iterator  (0) 2021.05.18
LinkedList  (0) 2021.05.04
컬렉션 프레임워크 (Collection Framework)  (0) 2021.05.02