객체는 사용자가 정의한 타입으로, 사용자가 원하는 임의의 정렬 기준에 맞춰 객체를 정렬할 수도 있다. 예를 들어, 성적을 나타내는 Grade 클래스가 있다고 해보자. 국어점수는 증가하는 순으로, 수학점수는 감소하는 순으로 정렬하고자 할 때 Grade 타입의 객체들을 임의의 기준으로 정렬하게 된다.
정렬 수행 시 기본적으로 적용되는 정렬 기준이 되는 메서드를 정의하는 인터페이스
→ Java의 모든 정렬 가능한 클래스들은 모두 Comparable 인터페이스를 구현하며, 정렬 시에 이에 맞게 정렬이 수행된다.
구현 방법 : 정렬할 객체에 Comparable interface를 implements 후, compareTo() 메서드 오버라이딩
*음수 또는 0을 리턴하는 경우 객체의 자리가 그대로 유지되며, 양수의 경우 두 객체의 자리가 바뀐다.
사용 방법
class Point implements Comparable<Point> {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public int compareTo(Point p) {
if (this.x > p.x) { // x좌표 오름차순 정렬
return 1;
} else if (this.x == p.x) {
if (this.y > p.y) { // x좌표가 같은 경우, y좌표 오름차순 정렬
return 1;
}
}
return -1;
}
}
// main에서 사용 시
List<Point> pointList = new ArrayList<>();
pointList.add(new Point(x, y));
Collections.sort(pointList);
Point[] pointArr = new Point[N];
pointArr[i] = new Point(x, y);
Array.sort(pointArr);
정렬 가능한 클래스들의 기본 정렬 기준과 다르게 정렬하고자 할 때 사용하는 인터페이스
→ 주로 익명 클래스로 사용되며, 오름차순을 내림차순으로 정렬할 때 많이 사용한다.
구현 방법 : Comparator interface를 implements 후, compare() 메서드를 오버라이e드한 myComparator class 작성
*compare()의 리턴값은 Comparable 인터페이스의 compareTo() 와 동일하며, Integer.compare(x, y)
의 return (x < y) ? -1 : ((x == y) ? 0 : 1); - 오름차순 정렬
과 동일한 개념
*내림차순 정렬의 경우, 두 파라미터 위치를 바꾸어 Integer.compare(y, x)
와 같이 작성한다.
**사용 방법 : Arrays.sort(array, myComparator), Collections.sort(list, myComparator)**
*Comparable의 사용법과 다른 점은 정렬 함수의 두 번째 인자로 Comparator interface를 받을 수 있다는 점이다.
ex. 우선순위 큐 생성자의 두 번째 인자로 Comparator interface를 받을 수 있다.
PriorityQueue(int initialCapacity, Comparator<? super E> comparator);
// Comparator 익명 클래스 사용
Comparator<Grade> myComparator = new Comparator<Grade>() {
@Override
public int compare(Grade g1, Grade g2) {
}
};
List<Grade> gradeList = new ArrayList<>();
gradeList.add(new Grade(kor, math));
Collections.sort(gradeList);
Grade[] gradeArr = new Grade[N];
gradeArr[i] = new Grade(kor, math);
Array.sort(gradeArr);
https://gmlwjd9405.github.io/2018/09/06/java-comparable-and-comparator.html