Comparable<T>
- 객체를 정렬하는 데 사용되는 메서드인 compareTo() 메서드를 정의해놓은 인터페이스로, 같은 타입의 인스턴스를 비교해야 하는 클래스들은 모두 Comparable 인터페이스를 구현하고 있다.
- 따라서 Boolean을 제외한 Wrapper 클래스와 String, Date, File 등의 클래스의 인스턴스는 모두 정렬 가능하며, 기본적으로 오름차순으로 정렬한다.
compareTo()
public interface Comparable {
public int compareTo(Object o);
}
- Comparable 인터페이스에서 객체를 정렬하기 위해 정의해놓은 메서드로, 해당 객체와 전달된 객체의 순서를 비교한다.
- 비교하는 두 객체가 같으면 0, 비교하는 값보다 작으면 음수, 크면 양수를 반환하도록 구현해서 사용한다.
public int compareTo(Car obj) {
if (this.modelYear == obj.modelYear) {
return 0;
} else if(this.modelYear < obj.modelYear) {
return -1;
} else {
return 1;
}
}
Comparator<T>
- Comparable 인터페이스와 같이 객체를 정렬하는 데 사용되는 인터페이스로, 기본 오름차순 정렬 기준 외에 다른 기준으로 정렬하고 싶을 때 사용한다.
- Comparator 인터페이스를 구현한 클래스에서는 compare() 메서드를 오버라이딩해서 사용한다.
메서드
int compare(T o1, T o2) | 전달된 두 객체의 순서를 비교한다. |
boolean equals(Object obj) | 해당 comparator와 전달된 객체가 같은지를 확인한다. |
Comparator<T> reversed() | 해당 comparator의 역순인 comparator를 반환한다. |
import java.util.Arrays;
import java.util.Comparator;
class ComparatorTest {
public static void main(String[] args) {
String[] arr = {"cat", "dog", "lion", "tiger"};
Arrays.sort(arr); // String의 Comparable 구현에 의한 정렬
Arrays.sort(arr, String.CASE_INSENSITIVE_ORDER); // 대소문자 구분 안함
Arrays.sort(arr, new Descending()); // 역순 정렬
}
}
class Descending implements Comparator<T> {
public int compare(Object o1, Object o2) {
// object 타입은 compareTo()를 바로 호출할 수 없으므로, Comparable로 형변환
// 즉, 해당 object가 Comparable을 구현했는지 확인하고 Comparable의 compareTo() 호출
if (o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable) o1;
Comparable c2 = (Comparable) o2;
return c1.compareTo(c2) * -1;
}
return -1;
}
}
'Java > Java' 카테고리의 다른 글
Enum 클래스 (0) | 2022.03.28 |
---|---|
Arrays, Collections (0) | 2022.03.28 |
Iterator (0) | 2022.03.28 |
Map 컬렉션 클래스 (0) | 2022.03.28 |
Set 컬렉션 클래스 (0) | 2022.03.28 |