● Arrays.sort( );
Array.sort( ) 메서드는 어떻게 알아서 정렬을 하는가?
우리가 무언가를 정렬한다는것은 무작위로 일렬로 세우는것도 정렬이지만,
데이터를 정렬하는것은 정렬 기준이 필요하다.
정렬 (整列)
명사 1 가지런하게 줄지어 늘어섬. 또는 그렇게 늘어서게 함.정렬로 세우다.
명사 2 데이터를 특정한 조건에 따라 일정한 순서가 되도록 다시 배열하는 일.
그 특정한 정렬의 조건이 바로 Comparable과 Comparator 이고 둘 다 정렬기준을 주는 인터페이스이지만,
차이점이 존재한다. 차이점에 앞서서 sort( ) 메서드에 대해서 다시 짚고넘어가자.
우리는 sort( int[] a ) 를 쓸때 정수타입의 배열을 넣으면 sort 메서드가 알아서 정렬해주는걸로 생각했겠지만
사실은 Comparable 인터페이스를 구현한 Integer(정수)의 기본정렬기준을 따라 정렬한것이고
Comparable을 구현한 클래스들의 기본정렬기준은 오름차순으로 정렬한다.
만약 오름차순으로 정리하기싫고 다른 기준으로 정렬하고 싶을때 사용하는것이 바로 Comparator다.
Comparable은 오름차순으로 정렬해주는 기본정렬기준이고, Comparator는 사용자가 직접
Comparator를 구현한 클래스(정렬기준)를 만들어 sort 메서드에 넣어서 사용한다는것이 차이점이다.
이제 직접 코딩을 하여 Comparator를 쓰는 방법에 대해서 알아보자
public class ComparatorEx {
public static void main(String[] args) {
String[] arr = {"Dog", "cat", "pig", "Eagle"};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
Arrays.sort(arr,String.CASE_INSENSITIVE_ORDER); // 대소문자를 구분하지 않겠다.
System.out.println(Arrays.toString(arr));
Arrays.sort(arr,new Descending()); //Comparator를 구현한 객체를 생성, 정렬기준
System.out.println(Arrays.toString(arr));
}
}
class Descending implements Comparator { //Comparator를 구현한 클래스 Descending
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable) o1;
Comparable c2 = (Comparable) o2;
return c1.compareTo(c2)*-1;
}
return -1;
}
}
compare 메서드는 Comparator의 메서드를 구현 , compareTo는 Comparable타입 참조변수 c1으로 호출한 메서드이다.
compareTo 는 Comparable의 메서드인데 Integer객체에 저장된 두 값을 비교하여 두수가 같으면 0 , 크면 -1, 작으면 1
을 반환하는 메서드이다. 여기에 -1 을 곱하여 리턴함으로써
기본정렬기준인 Comparable의 결과인 오름차순의 역으로, 내림차순으로 나타나게 된다.
실행결과
[Dog, Eagle, cat, pig]
[cat, Dog, Eagle, pig]
[pig, cat, Eagle, Dog]
'Java > Java Study' 카테고리의 다른 글
[Thread] Thread 정리 Part 1 (0) | 2021.08.17 |
---|---|
[ 객체지향 ] static (0) | 2021.07.08 |
[Collections Framework] Arrays (0) | 2021.06.03 |
[객체지향] Static 메서드는 언제 쓸까? (0) | 2021.06.02 |
[Collections Framework] LinkedList (vs Array) (0) | 2021.05.31 |