티스토리 뷰
객체들을 정렬하기 위해서는 정렬 기준이 필요하다. 단순한 숫자, 문자와 같은 기본형(primitive) 데이터는 Arrays.sort() 메서드를 이용하여 알아서 정렬할 수 있다. 하지만, 특정 타입의 객체는 정렬 기준이 필요하다.
아래와 같은 Student 객체가 있다고 하자.
public class Student {
private String name;
private String studentNum;
private int age;
public Student(String name, String studentNum, int age){
this.name = name;
this.studentNum = studentNum;
this.age = age;
}
}
아래와 같은 여러 명의 Student 객체를 담은 list를 학생의 나이 순으로 정렬하고자 할 때, Collection.sort(students)와 같은 방식을 사용할 수 없다.
List<Student> students = new ArrayList<>();
students.add(new Player("Alice", "201611", 26));
students.add(new Player("Bob", "202213", 20));
students.add(new Player("Chloe", "201808", 24));
students.add(new Player("Dale", "201572", 27));
students.add(new Player("Eric", "202122", 21));
Comparable
comparable 인터페이스를 상속받아 compareTo() 메서드를 Override하여 사용할 수 있다.
public class Student implements Comparable<Student> {
private String name;
private String studentNum;
private int age;
public Student(String name, String studentNum, int age){
this.name = name;
this.studentNum = studentNum;
this.age = age;
}
@Override
public int compareTo(Student o){
return this.age - o.age;
}
}
Comparable 인터페이스의 compareTo() 메서드를 이용하여 인자로 넘어온 같은 타입의 다른 객체와 비교가 가능하다.
메서드를 호출하는 객체가 인자로 넘어온 객체보다 작을 경우에는 음수, 크기가 동일하다면 0, 클 경우에는 양수 를 리턴한다.
내림차순으로 정렬하기를 원한다면 compareTo() 메서드를 재정의할 때, 인자로 넘어온 o.age 값에서 메서드를 호출하는 this.age 값을 빼주면 된다.
Comparator
정렬 대상 클래스의 코드를 직접 수정할 수 없거나 정렬하고자하는 객체에 이미 존재하고 있는 정렬 기준과 다른 기준으로 정렬하고 싶을 때에는 Comparator 인터페이스를 이용하면 된다.
Comparator 인터페이스의 구현체를 Arrays.sort()나 Collections.sort()와 같은 정렬 메서드의 인자로 넘기면 새로운 정렬 기준으로 객체를 정렬할 수 있다.
Comparator<Student> comparator = new Comparator<Student>() {
@Override
public int compare(Student a, Student b) {
return a.age - b.age;
}
};
Collections.sort(students, comparator);
이처럼 Comparator 객체를 인자로 넘기면 compare() 메서드 기준으로 정렬을 수행한다.
compare() 메서드는 비교 대상 두개의 객체를 인자로 받는데 첫번째 인자가 두번째 인자보다 작을 경우에는 음수, 크기가 동일하다면 0, 클 경우에는 양수 를 리턴한다.
'JAVA' 카테고리의 다른 글
[자료구조] TreeMap - getOrDefault (0) | 2023.02.27 |
---|