Comparable과 Comparator는 객체 정렬에 필요한 메서드(정렬 기준 제공)를 정의한 인터페이스
1. Comparable
- java.lang 패키지
- 기본 정렬 기준을 구현하는데 사용
public interface Comparable<T> {
public int compareTo(T o); // 주어진 객체(o)를 자신과 비교
// 반환값은 int형이지만 실제로 비교하는 객체가 같을 시 0, 비교하는 값보다 작으면 음수, 크면 양수
}
- Comparable을 구현하는 클래스는 같은 타입의 인스턴스끼리 서로 비교할 수 있는 Integer, String, Date, File 등이 있음
- 기본적으로 오름차순으로 구현됨(정렬)
2. Comparator
- java.util 패키지
- 기본 정렬 기준 외에 다른 기준으로 정렬하고자할 때 사용
public interface Comparator<T> {
int compare(T o1, T o2); // o1, o2 두 객체를 비교
// 반환값은 int형이지만 실제로 비교하는 객체가 같을 시 0, 비교하는 값보다 작으면 음수, 크면 양수
boolean equals(Object obj); // equals는 모든 클래스가 가진 공통적 메서드이지만 compare를 구현하는 클래스는 오버라이딩이 필요할 수 있다는 것을 뜻함
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
// 생략...
}
- compare()메소드는 매개변수인 o1, o2 두 객체를 비교
3. Comparator와 Comparable 예제
import java.util.*;
class Ex11_7 {
public static void main(String[] args) {
String[] strArr = {"cat", "Dog", "lion", "tiger"};
Arrays.sort(strArr); // Arrays.sort()는 Comparator를 지정하지 않은 경우, Comparable 구현체에 구현된 내용에 따라 정렬 - 기본 정렬기준(사전순 ABC...abc)
System.out.println("strArr=" + Arrays.toString(strArr));
Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); // Arrays.sort()는 Comparator를 CASE_INSENSITIVE_ORDER(대소문자 구분 안함)으로 지정한 경우
System.out.println("strArr=" + Arrays.toString(strArr));
Arrays.sort(strArr, new Descending()); // Arrays.sort()는 Comparator를 Descending()(내림차순 정렬)로 지정한 경우
System.out.println("strArr=" + Arrays.toString(strArr));
}
}
// Comparator 구현
class Descending implements Comparator { // 기본 정렬 기준 외에 다른 기준으로 정렬하고자 할 경우 사용하는 Comparator 인터페이스, 여기서는 역순으로 정렬하기 위해 사용
public int compare(Object o1, Object o2){
if( o1 instanceof Comparable && o2 instanceof Comparable) { // 형변환 가능 여부 검사 instanceof()
Comparable c1 = (Comparable)o1; // Comparable의 compareTo()메서드를 사용하기 위해 형변환
Comparable c2 = (Comparable)o2; // Comparable의 compareTo()메서드를 사용하기 위해 형변환
return c1.compareTo(c2) * -1 ; // -1을 곱해서 기본 정렬 방식의 역으로 변경(양수 -> 음수, 0 -> 0, 음수 -> 양수)
// 또는 c2.compareTo(c1)와 같이 순서를 바꿔도 됨
}
return -1;
}
}
4. 정렬(Sort)
- 두 대상을 비교하여 자리 바꿈을 반복
- 정렬의 방법은 버블, 삽입, 선택 ,퀵 등 의 방법이 있음, 정렬 기준이 달라짐
- 우리는 정렬 대상과 정렬 기준을 제시해주면 됨
'Java' 카테고리의 다른 글
Java HashMap, Hashtable (0) | 2023.01.07 |
---|---|
Java 컬렉션(Collection) - Set(집합) HashSet, TreeSet (0) | 2023.01.03 |
Java Arrays 클래스(Arrays Class) (0) | 2023.01.03 |
Java Iterator, ListIterator, Enumeration 인터페이스 (0) | 2023.01.03 |
Java 스택과 큐 (0) | 2023.01.03 |