Algorithm/JAVA

Comparator / Comparable

SPIGYEN 2021. 9. 13. 17:33

정렬을 구현하기 위해 필요한 내용 정리

sort 과정 1) 두 대상 비교 2) 자리 바꿈

정렬에는 1) 정렬 대상 2) 정렬 기준 필요

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

- Comparable : 기본 정렬기준을 구현하는데 사용 (Default)

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

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

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

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

 public final class Integer extends Number implements Comparable {
 	...
    public in t compareTo(Integer anotherInteger){
    	int v1 = this.value;
        int v2 = anotherInteger.value;
        
        return (v1 < v2? -1: (v1 == v2? 0:1));
    }
    ...
}

예제 1. 기존 구현되어 있는 정렬 메소드 이용 (CASE_INSENSITIVE_ORDER : 대소문자 구분 X)

import java.util.*;

public class b14681 {
	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));
		// 대소문자 비교 X
	}
	
}

출력 결과

StrArr=[Dog, cat, lion, tiger]
StrArr=[cat, Dog, lion, tiger]

예제 2. 기존 구현방법과 역순으로 정렬

import java.util.*;

public class b14681 {
	public static void main(String[] args) {
		String[] strArr = {"cat", "Dog", "lion", "tiger"};
		
		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을 곱해서 정렬 방식 바꿈
			// 또는 c2.compareTo(c1); 으로 순서를 바꿔도 됨
		}
		return -1;
	}
}

출력 결과

strArr=[tiger, lion, cat, Dog]