Comparator & Comparable

김설영·2022년 4월 15일
0

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

  • 정렬 : sort(). 두 대상을 비교한 후, 자리를 바꿈. 이를 반복함. -> 어떤 정렬 방식이든 이 원리는 동일함. (불변)

  • 하지만, 정렬 기준은 매번 달라질 수 있음. (가변) -> 변하는 부분만 정렬 방식에 기준으로써 제공.

// ex. 버블 정렬
// int[] intArr = {5, 3, 4, 0, 1, 2};

static void sort(int[] intArr) {
	for (int i = 0; i < intArr.length - 1; i++) {
    	for (int j = 0; j < intArr.length - 1; j++) {
        	int tmp = 0;
            
            if (intArr[j] > intArr[j + 1]) {	// 비교 기준. 정렬 기준만 가변적임.
            	tmp = intArr[j];
                intArr[j] = intArr[j + 1];
                intArr[j + 1] = tmp;
            }
        }
    }
}

//					정렬대상		  정렬기준
static void sort(Object[] objArr, Comparator c) {
	for (int i = 0; i < objArr.length - 1; i++){
    	for (int j = 0; j <objArr.length - 1; j++) {
        	Object tmp = null;
            
            // 정렬 기준이 Comparator c로 넘어와서 정렬 기준(비교) 제공
            if (c.compare(objArr[j], objArr[j+1]) > 0) {
            	tmp = objArr[j];
                objArr[j] = objArr[j + 1];
                objArr[j + 1] = tmp;
            }
        }
    }
}
  • 정렬을 할 때에는, 정렬 대상과 기준이 있어야 하는데, 대표적인 기준은 아래의 두 인터페이스이다.
// default = comparable
static void sort(Object[] a)  // 객체 배열에 저장된, 객체가 구현한 Comparable에 의한 정렬

static void sort(Object[] a, Comparator c)  // 지정한 Comparator에 의한 정렬

Comparable

  • 기본 정렬 기준을 구현하는 데 사용
public interface Comparable {
	int compareTo(Object o);  // 주어진 객체(o)를 자신(this)과 비교
}
// Integer & Comparable
// 기본 정렬 기준 제공

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;
        
        // -1, 0, 1
        return (thisval < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));
        // 위 리턴문은 아래와 같이 표현할 수도 있다. (음수, 0, 양수)
        // 다만, 삼항연산자의 연산 속도가 조금이라도 더 빠르기 떄문에, 뺄셈보다는 삼항연산자를 사용한 것이다.
        return thisVal - anotherVal
    }
}

Comparator

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

  • 오름차순, 내림차순 등 다양한 정렬 기준이 있음.

public interface Comparator {
	int compare(Object o1, Object o2);  // o1, o2 두 객체를 비교 -> 정수값 반환.
    									// 값이 0이면 같은것, 양수면 왼쪽이 큰것, 음수면 오른쪽이 큰것
    boolean equals(Object obj);			// equals를 오버라이딩 하라는 뜻
}
profile
블로그 이동하였습니당! -> https://kimsy8979.tistory.com/

0개의 댓글