컬렉션 프레임워크 - Comparator & Comparable
2022. 7. 21. 23:06ㆍJava
◎ 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 |