Comparable, Comparator을 이용하여 Java 객체를 정렬할 수 있다.

Goal

  • Comparable을 이용하여 Java 객체를 정렬할 수 있다.
  • Comparator을 이용하여 Java 객체를 정렬할 수 있다.

객체 정렬 예시

객체의 정렬 기준을 명시하는 두 가지 방법

1. Interface Comparable

참고 Arrays.sort()와 Collections.sort()의 차이

  1. Arrays.sort()
    • 배열 정렬의 경우
    • Ex) byte[], char[], double[], int[], Object[], T[] 등 * Object Array에서는 TimSort(Merge Sort + Insertion Sort)를 사용
    • Object Array: 새로 정의한 클래스에 대한 배열 * Primitive Array에서는 Dual Pivot QuickSort(Quick Sort + Insertion Sort)를 사용
    • Primitive Array: 기본 자료형에 대한 배열
  2. Collections.sort()
    • List Collection 정렬의 경우
    • Ex) ArrayList, LinkedList, Vector 등 * 내부적으로 Arrays.sort()를 사용

Comparable interface를 이용한 Java 객체를 정렬

// x좌표가 증가하는 순, x좌표가 같으면 y좌표가 감소하는 순으로 정렬하라.
class Point implements Comparable<Point> {
    int x, y;

    @Override
    public int compareTo(Point p) {
        if(this.x > p.x) {
            return 1; // x에 대해서는 오름차순
        }
        else if(this.x == p.x) {
            if(this.y < p.y) { // y에 대해서는 내림차순
                return 1;
            }
        }
        return -1;
    }
}

// main에서 사용법
List<Point> pointList = new ArrayList<>();
pointList.add(new Point(x, y));
Collections.sort(pointList);

2. Interface Comparator

참고 두 번째 인자로 Comparator interface를 받는 경우

Comparator interface를 이용한 Java 객체를 정렬

// x좌표가 증가하는 순, x좌표가 같으면 y좌표가 감소하는 순으로 정렬하라.
class MyComparator implements Comparator<Point> {
  @Override
  public int compare(Point p1, Point p2) {
    if (p1.x > p2.x) {
      return 1; // x에 대해서는 오름차순
    }
    else if (p1.x == p2.x) {
      if (p1.y < p2.y) { // y에 대해서는 내림차순
        return 1;
      }
    }
    return -1;
  }
}

// main에서 사용법
List<Point> pointList = new ArrayList<>();
pointList.add(new Point(x, y));
MyComparator myComparator = new MyComparator();
Collections.sort(pointList, myComparator);

Comparator 익명 클래스 이용

Comparator<Point> myComparator = new Comparator<Point>() {
  @Override
  public int compare(Point p1, Point p2) { 위와 동일 }
};

List<Point> pointList = new ArrayList<>();
pointList.add(new Point(x, y));
Collections.sort(pointList, myComparator);

References