Comparator
과 Comparable
은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있다. 우리가 이 인터페이스를 구현하는데 생각해야할 것은 "어떤 기준으로 객체를 비교하게 만드는가" 이다.
Comparable
: 자기 자신과 매개변수 객체를 비교
Comparator
: 두 매개변수 객체를 비교
자기 자신과 매개변수 객체를 비교한다.
Comparable 인터페이스 정의
compareTo 함수를 구현한다.
public clas ClassName implements Comparable<T> {
/*
...
code
...
*/
// 필수 구현 부분
@Override
public int compareTo(Type o) {
/*
비교 구현
}
대부분의 경우 아래와 같이 간단한 뺄셈
만으로 compareTO()를 구현할 수 있지만, 보다 나은 성능을 위해서는 삼항 연산자
를 사용한다. (Integer
클래스의 compareTo()
함수들 참고)
class Student implements Comparable<Student> {
int age; // 나이
int classNumber; // 학급
Student(int age, int classNumber) {
this.age = age;
this.classNumber = classNumber;
}
@Override
public int compareTo(Student o) {
return this.age - o.age;
}
}
두 매개변수 객체를 비교
Comparator 인터페이스 정의
compare() 함수를 구현한다.
import java.util.Comparator; // import 필요
public class ClassName implements Comparator<Type> {
/*
...
code
...
*/
// 필수 구현 부분
@Override
public int compare(Type o1, Type o2) {
/*
비교 구현
*/
}
}
import java.util.Comparator; // import 필요
class Student implements Comparator<Student> {
int age; // 나이
int classNumber; // 학급
Student(int age, int classNumber) {
this.age = age;
this.classNumber = classNumber;
}
@Override
public int compare(Student o1, Student o2) {
return o1.classNumber - o2.classNumber;
}
}
import java.util.Comparator; // import 필요
class DescComp implements Comparator { // 객체 2개 비교
public int compare(Object o1, Object o2) {
if(!(o1 instanceof Integer && o2 instanceof Integer))
return -1;
Integer i = (Integer)o1;
Integer i2 = (Integer)o2;
return i.compareTo(i2) * -1;
}
}