JAVA
Comparator
오매준
2024. 5. 27. 17:56
# Comparable
- 이 인터페이스를 구현한 클래스는 크기 비교가 가능해진다
- compareTo() 메서드를 구현해두면 크기 비교가 필요한 상황에서
해당 메서드를 호출해 크기를 비교할 수 있게 된다
# Comparator
- 이 인터페이스를 구현한 클래스는 크기 비교의 기준이 된다
- 이 인터페이스를 구현한 클래스의 인스턴스를 필요한 상황에서 함께 전달할 수 있다
Wrapper 클래스들은 Comparable이 이미 구현되어 있으므로
compareTo() 메서드를 직접 구현할 필요가 없다
List<Integer> nums = new ArrayList<>();
Collections.addAll(nums, 88, 89, 90, 15, 10, 11, 12, 13, 1, 99);
Collections.sort(nums);
System.out.println(nums);
Comparable 인터페이스를 구현한 클래스는 각 인스턴스끼리의 크기 비교가 가능해진다
(-> 정렬이 가능해 진다)
class Grape implements Comparable<Grape> {
String farm;
int qty;
double sweet;
String grade;
public Grape(String farm, int qty, double sweet, String grade) {
this.farm = farm;
this.qty = qty;
this.sweet = sweet;
this.grade = grade;
}
}
먼저 Comparable을 상속받는 Grape 클래스를 만들어준다
그 후 Grape 클래스 안에 compareTo() 메서드를 override
@Override
public int compareTo(Grape g) {
/*
현재 인스턴스와 매개변수로 전달받은 인스턴스를 비교하였을 때
어떤 것이 더 크다고 판정할것인지 정해야 한다
두 인스턴스의 크기가 같다 : 0을 리턴
현재 인스턴스의 크기가 더 크다 : 1을 리턴
매개변수 인스턴스의 크기가 더 크다 : -1을 리턴
*/
// 예시: 포도알의 개수를 기준으로 두 인스턴스의 크기를 비교
if (this.qty == g.qty) {
// 포도알 개수가 같으면 당도를 기준으로 다시 크기 비교
if (this.sweet == g.sweet) {
return 0;
} else if (this.sweet > g.sweet) {
return 1;
} else {
return -1;
}
} else if (this.qty > g.qty) {
return 1;
} else {
return -1;
}
}
List<Grape> grapes = new ArrayList<>();