컬렉션 프레임워크 - Comparator & Comparable

2022. 7. 21. 23:06Java

Comparator & Comparable

-> Comparator와 Comparable은 객체 정렬에 필요한 메서드를 정의한 인터페이스다.

public interface Comparator{
			int compare(Object o1, Object o2);
			boolean equals(Object obj);
}

-> o1,o2 두 객체를 비교하여 두 객체가 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환한다.

 

public interface Comparable{
			public int compareTo(Object o);
}

-> 객체 o를 자신과 비교하여 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환한다.

-> Comparable은 기본 정렬기준을 구현하는데 사용된다.

-> Comparator는 기본 정렬기준 외 다른 기준으로 정렬할 때 사용한다.

 

import java.util.*;

public class ComparatorEx {

	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); // 대소문자 구분안함 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;
	}
}

-> 결과

-> 첫 번째 정렬에서는 정렬 기준 없이 String의 Comparable구현에 의해 정렬되었고, Comparable의 정렬 기준은 문자열이 사전 순으로 정렬되도록 구현되어 있기 때문에 사전 순으로 정렬이 되었다.

-> 두 번째 정렬에서는 정렬기준을 'String.CASE_INSENSITIVE_ORDER' 즉, 대소문자 구분하지 않는 것으로 정했기 때문에 대문자에 상관없이 사전 순으로 정렬된다.

-> 세 번째 정렬에서는 정렬기준을 역순정렬로 정하여 그에 맞는 클래스를 작성해서 기본 정렬 방식의 역으로 정렬되도록 구현하였다. 또한 Desecending클래스에서 compare()의 매개변수가 Object타입이기 때문에 compareTo()를 바로 호출하지 못하고, Comparable로 형변환 후 호출하였다.

'Java' 카테고리의 다른 글

스코프 - 지역 변수  (1) 2023.12.21
얕은 복사 & 깊은 복사  (0) 2023.01.03
컬렉션 프레임워크 - Arrays  (0) 2022.07.13
컬렉션 프레임워크 - Iterator  (0) 2022.07.04
컬렉션 프레임워크 - LinkedList  (0) 2022.06.29