728x90
TreeSet이나 TreeMap 같은 컬렉션에 저장되는 객체는 저장과 동시에 오름차순으로 정렬
이때, 어떤 객체든 정렬될 수 있는 것이 아닌, 객체가 `Comparable` 인터페이스를 구현하고 있어야 가능함
Integer, Double, String 타입은 Comparable을 구현하고 있으므로 상관 없음
📌 사용자 정의 객체를 저장할 땐 반드시 Comparable을 구현해야 함
Comparable
comparable 인터페이스에는 `compareTo()` 메소드가 정의돼 있음
∴ 사용자 정의 클래스에서 이 메소드를 재정의하여 비교 결과를 정수 값으로 반환해야 함
리턴 타입 | 메소드 | 설명 |
int | compareTo(T o) | 주어진 객체와 같으면 0, 주어진 객체보다 적으면 음수, 주어진 객체보다 크면 양수 리턴 |
Comparator
비교 기능이 있는 구현체를 TreeSet에 저장하거나 TreeMap에 저장하는 게 원칙이지만,
비교 기능이 없는 (= Comparable 비구현) 객체를 저장하고 싶다면 생성 시 `비교자`를 제공하면 됨
TreeSet<E> treeSet = new TreeSet<E>(new ComparatorImpl());
- 비교자는 `Comparator` 인터페이스를 구현한 객체를 의미
- comparator 인터페이스에는 `compare()` 메소드가 정의돼 있음
리턴 타입 | 메소드 | 설명 |
int | compare(T o1, T o2) | o1과 o2가 동등하면 0, o1이 o2보다 앞에 오려면 음수, o1이 o2보다 뒤에 오려면 양수 리턴 |
예제 👇🏻
더보기
1. Comparable을 구현하지 않은 Fruit 클래스
public class Fruit{
public String name;
public int price;
public Fruit(String name, int price){
this.name = name;
this.price = price;
}
}
2. Comparator을 구현한 FruitComparator 클래스
public class ComparatorFruit implements Comapartor<Fruit>{
@Override
public int compare(Fruit o1, Fruit o2){
return o1.price-o2.price;
}
}
3. Main
TreeSet<Fruit> set = new TreeSet<>(new ComparatorFruit());
보통은 Comparator를 `익명 구현 객체`나 `람다 표현식`으로 사용함
List<String> list = new ArrayList<>();
// 익명 구현 객체
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
// 람다 표현식
Collections.sort(list, (o1, o2) -> o1.compareTo(o2));
728x90