자바에서의 정렬은 Comparator와 Comparable 인터페이스를 구현하는 방법이 있다.
데이터의 정렬을 위해서는 데이터를 가지고 있는 자료구조 내의 데이터 간 크기를 비교할 수 있어야 한다.
즉, 자바에선 비교를 위한 오브젝트들의 수치화가 가능해야 한다.
Comparable<T> Interface가 받을 수 있는 데이터 T는
Comparable Interface를 좀 더 자세히 살펴보자.
Comparable Interface는 Natural Order(자연 정렬)을 구현하고 있으며
Comparable<T> Interface는 CompareTo(T o)만을 메소드로 정의하고 있는데
ComparaTo(T o)는
Compares this object with the specified object for order.
Returns a negative integer, zero, or a positive integer as this
object is less than, equal to, or greater than the specified object.
this가 o보다 큰 경우 1 반환 this > o return 1;
this가 o보다 작은 경우 -1 반환 this < o return -1;
this가 o와 같은 경우 0을 반환 this == o return 0:
Comparator는 java.util.Comparator 인터페이스로 존재한다.
java doc의 설명에 따르면 기본적인 정렬이 아닌 각 개체 콜렉션에 순서를 비교할 수 있고 이는 Arrays.sort / Collections.sort에 전달할 수 있다.
즉 내가 지정한 객체의 컬렉션을 가지고 비교를 할 수 있다.
Comparator는 Compare(T o1, T o2)를 메소드로 정의하고 있으며
int compare (T o1, T o2)
a negative integer, zero, or a positive integer as the first
argument is less than, equal to, or greater than the second.
첫번째 객체 > 두번째 객체 return 1;
첫번째 객체 < 두번째 객체 return -1;
첫번째 객체 == 두번째 객체 return 0;
각 Comparable Interface를 구현하고 있는 클래스끼리는 인스턴스 비교가 가능하고
Natural Order가 된다.
static final class NaturalOrder implements Comparator<Object> {
@SuppressWarnings("unchecked")
public int compare(Object first, Object second) {
return ((Comparable<Object>)first).compareTo(second);
}
static final NaturalOrder INSTANCE = new NaturalOrder();
}
Comparator 를 통해 compare(O o1, O o2)를 구현하고 있다.
결론적으로 Array나 List같은 경우는 Comparable Inteface를 구현한 클래스들을 사용하여 Natural Order를 할 수 있다.
public static void main(String[] args) {
String[] name = new String[]{"ab", "cd", "ef", "ge", "hr", "zx", "wqw", "xcv"};
Arrays.sort(name);
for (int i = 0; i < name.length; i++) {
System.out.print(name[i] + " ");
}
System.out.println();
Arrays.sort(name, Collections.reverseOrder());
for (int i = 0; i < name.length; i++) {
System.out.print(name[i] + " ");
}
}
기본적인 Arrays.sort Collections.sort API를 사용한 문자열 정렬이다.
ab cd ef ge hr wqw xcv zx // Arrays.sort(name)
zx xcv wqw hr ge ef cd ab // Arrays.sort(name, Collections.reverseOrder())