새로 정의한 객체를 정렬해야 할 경우가 있다. 예를 들어 String name
과 int phone_number
를 field로 가지는 객체 Student
가 있다고 가정하자. Student
객체 n개를 가진 ArrayList List<Student> arrlist
가 있다면, 1) ArrayList를 학생의 이름 순으로 정렬해야하는 경우나 2) ArrayList를 학생의 핸드폰 번호 순으로 정렬해야하는 경우가 있을 수 있다.
Java에서는 이러한 객체를 정렬하는 기준을 Custom할 수 있도록 몇 가지 interface를 제공하는데, 바로 Comparble과 Comparator다.
java.lang.Comparble
Comparable
을 implement하고, compareTo()
메소드를 @Override한다.현재 객체
> Object로 넘어온 객체
일 경우 양수 return현재 객체
< Object로 넘어온 객체
일 경우 음수 return현재 객체
= Object로 넘어온 객체
일 경우 '0' returnArrays.sort(arr);
Collections.sort(list);
static public class Student implements Comparable{
// field
private String name;
private HashMap<String, Integer> scores;
(...생략...)
@Override
public int compareTo(Object o) {
Student s = (Student) o;
if (this.scores.get("Java") > s.scores.get("Java")){
return 1;
}
else {
return -1;
}
}
}
Dual Pivot QuickSort
(QuickSort + InsertionSort)Tim Sort
(MergeSort + InsertionSort)내부적으로 Arrays.sort() 사용
java.lang.Comparator
Comparator
를 implement한 객체를 생성하고, compare()
method를 @Override한다.현재 객체
> Object로 넘어온 객체
일 경우 양수 return현재 객체
< Object로 넘어온 객체
일 경우 음수 return현재 객체
= Object로 넘어온 객체
일 경우 '0' returnComparator
의 익명 클래스를 선언하고, compare()
method를 @Override한다.현재 객체
> Object로 넘어온 객체
일 경우 양수 return현재 객체
< Object로 넘어온 객체
일 경우 음수 return현재 객체
= Object로 넘어온 객체
일 경우 '0' returnCollections.sort(arrlist, new PyComparator());
Collections.sort(arrlist, SpComparator);
class PyComparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
if (s1.scores.get("Python") > s2.scores.get("Python")) {
return 1;
}
else {
return -1;
}
}
}
Collections.sort(arrlist, new PyComparator());
Comparator<Student> SpComparator = new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
if (s1.scores.get("Spring") > s2.scores.get("Spring")) {
return 1;
}
else {
return -1;
}
}
};
Collections.sort(arrlist, SpComparator);