Comparable, Comparator 을 이용한 Java 객체 정렬

dev-jjun·2023년 1월 6일
0

Algorithm

목록 보기
1/15
post-thumbnail

객체 정렬이란?

객체는 사용자가 정의한 타입으로, 사용자가 원하는 임의의 정렬 기준에 맞춰 객체를 정렬할 수도 있다. 예를 들어, 성적을 나타내는 Grade 클래스가 있다고 해보자. 국어점수는 증가하는 순으로, 수학점수는 감소하는 순으로 정렬하고자 할 때 Grade 타입의 객체들을 임의의 기준으로 정렬하게 된다.

객체 정렬 기준을 지정하는 2가지 방법

1️⃣ Comparable [java.lang.Comparable]

정렬 수행 시 기본적으로 적용되는 정렬 기준이 되는 메서드를 정의하는 인터페이스

→ Java의 모든 정렬 가능한 클래스들은 모두 Comparable 인터페이스를 구현하며, 정렬 시에 이에 맞게 정렬이 수행된다.

구현 방법 : 정렬할 객체에 Comparable interface를 implements 후, compareTo() 메서드 오버라이딩

  • 현재 객체 < 파라미터 객체 : 음수
  • 현재 객체 == 파라미터 객체 : 0
  • 현재 객체 > 파라미터 객체 : 양수

*음수 또는 0을 리턴하는 경우 객체의 자리가 그대로 유지되며, 양수의 경우 두 객체의 자리가 바뀐다.

사용 방법

  • Arrays.sort(array) 배열 정렬 → byte[], char[], int[], Object[], T[] 등
    *Object 타입의 배열은 새로 정의한 클래스에 대한 배열로, Timsort(삽입정렬+병합정렬)를 사용하고, Primitive 타입의 배열은 기본 자료형에 대한 배열로, Dual Pivot Quicksort(퀵정렬+삽입정렬)를 사용한다.
  • Collections.sort(list) List Collection 정렬 → ArrayList, LinkedList, Vector 등
    *내부적으로 Arrays.sort()를 사용한다.
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);

2️⃣ Comparator [java.util.Comparator]

정렬 가능한 클래스들의 기본 정렬 기준과 다르게 정렬하고자 할 때 사용하는 인터페이스

→ 주로 익명 클래스로 사용되며, 오름차순을 내림차순으로 정렬할 때 많이 사용한다.

구현 방법 : 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

https://st-lab.tistory.com/243

profile
서버 개발자를 꿈꾸며 성장하는 쭌입니다 😽

0개의 댓글