Java
JAVA 객체 정렬하기 - Comparable, Comparator
Code Don
2022. 1. 5. 00:03
기본적으로 자바에서 제공하는 정렬 기능인 Sort 는 다양한 Attributes로 이루어진 객체를 일반적으로 정렬할 시 에러는 뿜는다.
그렇다면 객체를 어떻게 어떤 기준으로 정렬할 수 있을 까? 에 대한 고민이 들었다.
보통 정렬하면 아래 코드를 생각하기 쉽다.
Integer iArr = new Integer[]{2, 5, 3, 1};
Arrays.sort(iArr);
System.out.println("iArr : " + iArr.toString());
// iArr : [1, 2, 3, 5]
그렇다면 객체 정렬을 어떻게 할까?
일단 객체를 정렬하기 위해서는 정렬 기준이 있어야한다.
예를 들어 아래 객체가 있다고 하자
public class Edge {
private Integer distance;
private String vertex;
// getter, setter, constructor 생략
}
그리고 아래와 같은 객체들을 생성한다
Edge edge_1 = new Edge(10, "A");
Edge edge_2 = new Edge(15, "A");
Edge edge_3 = new Edge(12, "A");
Edge[] edges = new Edge[]{edge_1, edge_2, edge_3};
Arrays.sort(edges);
// java.lang.ClassCastException 유발
일반적인 정렬을 하면 예외가 발생된다.
이럴때는 Comparable or Comparator 인터페이스를 사용하면 된다.
위에 두 개 모두 인터페이스이며, 정렬 기준을 구현하기 위해 사용된다.
- Comparable 는 compareTo() 메서드를 상속하여 구현
- 일반적으로는 정렬할 객체에 Implements 로 Comparable 인터페이스를 추가하여 구현
- Comparator 는 compare() 메서드를 상속하여 구현
- 일반적으로는 별도의 클래스를 정의해서 구현하며, 따라서 동일 객체에 다양한 정렬 기준을 가진 클래스 작성 가능
//Comparable 사용
public class Edge implements Comparable<Edge> {
private Integer distance;
private String vertex;
@Override
public int compareTo(Edge e) {
return this.distance - e.distance;
}
// getter, setter, constructor 생략
}
Edge edge_1 = new Edge(10, "A");
Edge edge_2 = new Edge(15, "A");
Edge edge_3 = new Edge(12, "A");
Edge[] edges = new Edge[]{edge_1, edge_2, edge_3};
Arrays.sort(edges);
for (int i = 0; i < edges.length; i++) {
System.out.println(edges[i].getDistance());
}
// distance
// 10, 12, 15
Edge 객체의 distance의 속성 값으로 오름차순 정렬이 되는 것을 볼 수 있다.
그렇다면 내림차순은 어떻게 할까?
@Override
public int compareTo(Edge e) {
// return this.distance - e.distance; // 오름차순
return e.distance - this.distance; // 내림차순
}
이번엔 Comparator 를 사용해보자
//Comparator 사용
public class Edge implements Comparable<Edge> {
private Integer distance;
private String vertex;
@Override
public int compareTo(Edge e) {
return this.distance - e.distance;
}
// getter, setter, constructor 생략
}
Edge edge_1 = new Edge(10, "A");
Edge edge_2 = new Edge(15, "A");
Edge edge_3 = new Edge(12, "A");
Edge[] edges = new Edge[]{edge_1, edge_2, edge_3};
// 달라지는 부분
Arrays.sort(edges, Comparator<Edge>() {
@Override
public int compare(Edge obj1, Edge obj2) {
return obj2.getDistance() - obj1.getDistance();
}
});
for (int i = 0; i < edges.length; i++) {
System.out.println(edges[i].getDistance());
}
// distance
// 15, 12, 10
“달라지는 부분” 으로 주석한 부분을 보면 sort 메서드에 Comparator 객체를 생성하고 compare 메서드를 정의함으로서 정렬이 되는 것을 확인할 수 있다.
이때 기존의 객체에 Comparable 인터페이스로 정렬 기준을 정의 했다 하더라도 Comparator 객체를 사용하면 Comparator 객체의 정렬 기준이 우선 순위가 되어 정렬된다.