자바의 정석 - Comparator와 Comparable

Yohan·2024년 2월 10일
0
post-custom-banner

Comparator와 Comparable

  • 객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스
    • Comparable : 기본 정렬기준을 구현하는데 사용
    • Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용
    • Comparable의 CompareTo() 메서드 - 주어진 객체를 자신(this)과 비교
    • Comparator의 compare() 메서드 - 두 객체를 비교하여 정수 값으로 반환
      정수 값 - 양수(왼쪽大), 0(같다), 음수(오른쪽大)
public interface Comparator {
	int compare(Object o1, Object o2); // o1, o2 두 객체를 비교
    boolean equals(Object obj); // equals를 오버라이딩하라는 뜻
}

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

예제

class Ex1 {
	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); // 대소문자 구분안함
		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 c1.compareTo(c2) * -1; // -1을 곱해서 기본 정렬방식의 역으로 변경
		}
		return -1;
	}
}

Integer와 Comparable

  • 정렬기준(오름차순, 내림차순, 나이순 ,키순 ..)이 달라지는 것, 정렬 로직은 불변이므로 정렬 기준만 주면 된다.

정리

  • Comparable : 일반적인 정렬이 필요할때 사용 , compareTo 메소드 사용
  • Comparator : 특정한 정렬기준이 필요할때 , compare() 메소드 사용
  • 정렬기준(오름차순, 내림차순, 나이순 ,키순 ..)이 달라지는 것, 정렬 로직은 불변이므로 정렬 기준만 주면 된다.
profile
백엔드 개발자
post-custom-banner

0개의 댓글