특정 클래스(A)의 인스턴스가 담긴 ArrayList를 정렬하고 싶었다. 정렬 기준을 주기 위해 Comparable 인터페이스를 사용해보려고 했으나 일단 놔뒀다. 그래도 오늘 다시 학습했으니 기록으로 남겨본다.
배열(컬렉션 포함)을 sort메서드로 정렬할 때의 정렬 기준을 제시하는 방법에는 두 가지가 있다.
implements Comparable<T>
을 선언하고 compareTo
추상메서드를 오버라이딩하여 내가 원하는 기본 정렬기준을 제시해줄 수 있다.. public class LedgerItem implements Comparable<LedgerItem> {
...
@Override
public int compareTo(LedgerItem o) {
return this.order - o.order;
}
}
Comparable
을 구현한 클래스는 sort메서드로 정렬할 때 따로 정렬 기준(Comparator)을 제시하지 않아도 된다. 기본 정렬 기준을 제시해줬으니까 sort내부적으로 compareTo를 호출해서 정렬한다.List<LedgerItem> items = new ArrayList<>();
//...items를 채우고...
Collections.sort(items);
implements Comparator
를 선언하고 compare
메서드를 선언한다.class ClassName implements Comparator {
public int compare(Object o1, Object o2) {
//Comparable인터페이스를 구현한 클래스의 compareTo메서드처럼 음수, 0, 양수를 리턴하도록 구현한다.
...
return 양수 or 음수 or 0;
}
}
위와 같이 Comparator를 구현한 후 sort메서드를 호출할 때 인자로 넘겨준다. 이때에도 sort메서드 내부적으로 compare메서드를 호출해서 정렬하게 된다.
List<LedgerItem> items = new ArrayList<>();
//...items를 채우고...
Collections.sort(items, new ClassName());