- 객체 정렬에 필요한 (정렬기준을 제공하는)메서드를 정의한 인터페이스
- 정렬에 사용되고 정렬기준(오름차순, 내림차순 ... 등)을 제공한다.
그럴 때 Comparator, Comparable 사용
정렬 = sort() = 두 대상을 비교하여 자리바꿈을 반복하는 것
정렬 시 1. 대상 2. 기준 이 필요함. sort(정렬대상, 정렬기준)
Arrays.sort()를 호출만 하면 컴퓨터가 알아서 배열을 정렬하는 것처럼 보이지만, 사실은 Character클래스의 Comparable의 구현에 의해 정렬되었던 것이다.
- Comparable
Java.lang 패키지
Comparable 을 구현하고 있는 클래스들은 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들
(주로 Integer와 같은 wrapper클래스, String, Date, File)
기본적으로 오름차순, 사전순(기본정렬기준)
사전순은 대문자먼저 → 그 다음 소문자
- int compareTo(Object o)
인자값(o)과 객체 나 자신(this)과 비교
- Comparator
java.util 패키지
기본정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용
- int compare(Object o1, Object o2)
o1, o2 중 어느 쪽이 큰 지 정수값으로 알려줌
결과값이 0이면 같음
결과값이 양수면 왼쪽이 큼
결과값이 음수면 오른쪽이 큼
compare()와 compareTo()는 선언형태와 이름이 약간 다를 뿐 두 객체를 비교한다는 같은 기능의 목적.
compareTo()의 반환값은 int이지만 실제로는 비교 하는 두 객체가 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환하도록 구현.
compare()도 객체를 비교해서 음수, 0, 양수 중의 하나를 반환 하도록 구현해야한다.
equals메서드는 모든 클래스가 가지고 있는 공통적인 메서드이지만, Comparator를 구 현하는 클래스는 오버라이딩이 필요할 수도 있다는 것을 알리기 위해서 정의한 것일 뿐, 그냥 compare(Object ol, Object o2)만 구현하면 된다.
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));
...
}
이 때,
삼항연산자 쓰는 편이 빼는 것 보다 성능면에서 좋다
Integer값은 32bit 값이고 32가지를 모두 빼야 값을 알수 있는데
삼항연산자는 비교하는 것이므로 앞에서부터 비교하면 되므로 앞부분에서 판가름이 나서 32가지를 안해도 되므로 빠르다.
String클래스가 정렬기준을 가지고 있으므로 정렬기준을 안넣어도 compareTo메서드를 사용해서 정렬을 한다.
그 기준이 싫으면 두번째 인자값에 따로 정렬기준을 줄 수있다.
* String.CASE_INSENSITIVE_ORDER : 대소문자 구별 안하고 정렬
역순정렬하기위한 메서드를 구현해보자면
public int compare(Object ol, Object o2){
if ( ol instanceof Comparable && o2 instanceof Comparable) {
//비교대상ol,o2이 Comparable이 아니면 비교할 수 없기때문에 -1를 반환하게 한다.
Comparable cl = (Comparable)ol;
Comparable c2 = (Comparable)o2;
//비교할 수 있는 대상이면 compareTo메서드를 호출해서 정렬
return cl. compareTo (c2) * -1 ; // —1을 곱해서 기본 정렬방식의 역으로 변경한다.
// 또는 c2.compareTo (cl)와 같이순서를바꿔도 된다.
}
return -1;
}
'Java > ㄴ collection*컬렉션' 카테고리의 다른 글
[Java] 💻List, Set, Map (0) | 2022.02.27 |
---|
댓글