Comparator와 Comparable
객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스
Comparable : 기본 정렬기준을 구현하는데 사용. - compareTo(Object o)
Comparator : 기본 정렬 기준 외에 다른 기준으로 정렬하고자 할 때 사용. compare(Object o1, Object o2)
중요한 건, compareTo, compare 메서드 모두 정렬기준을 제공하고, 같으면 0, 오른쪽이 더 크면 음수, 왼쪽이 더 크면 양수를 리턴한다는 것이다!
ex) String[ ] strArr = {"cat", "Dog", "lion", "tiger"}; 객체 배열에 저장된 객체가 구현한 Comparable(정렬 기준)에 의한 정렬. Arrays.sort(strArr); // String의 Comparable구현에 의한 정렬. 대문자 먼저 나오고 사전순(ABCabc) 정렬. 정렬 : ① 대상 ② 기준⭐️⭐️⭐️⭐️⭐️ Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);//대소문자 구분없이 사전순 정렬. Arrays.sort(strArr, new Descending());//역순 정렬(기본 정렬 기준인 사전 순서 반대)
정렬 기준 직접 정의 : 또는 c1, c2 자리를 바꿔서 c2.compareTo(c1)해도 된다.
기본 정렬 기준 사전 순서 반대로 정렬하는 방 c1.compareTo(c2) : 자기자신 c1과 c2를 비교한다. 같으면 0, 오른쪽 더 크면 +, 왼쪽 더 크면 + c1.compareTo(c2) = 기본 정렬 기준이므로 오름차순 정렬. ① 본 정렬 기준 결과에 -1을 곱해버리면 양수=>음수, 음수=>양수가 되기 때문에 결과를 반대로 할 수 있다. ② c1, c2 순서를 바꿔서 c2.compareTo(c1) 으로 해도 된다. c2를 기준으로 기본 정렬 기준 오름차순 정렬.?
class Descending implements Comparator { 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;//-1을 곱함으로써 양수->음수, 음수->양수. } return -1; }
Interface that defines methods(sorting criteria) when sorting objects. - Comparable : Default sorting criteria in java.lang package. ex) ascending, descending,... - Comparator : When sorting not only default sorting criteria but also other sorting criteria in java.util package.
compare( ), compareTo( ) : Return the result of Comapraing two objects.
Using Ternary Operator twice(3항 연산자를 2번 씀)
class string implements Comparable Comparable:Standard Sorting Criteria String itself has compareTo(Sorting Criteria). So it does not matter even if the parameter is only object not with criteria. The Standard sorting criteria is dictionary.
2번째 복습
sorting의 가장 간단한 방법은 Collections.sort와 Arrays.sort가 있다. 두 메서드 전부 O(nlogn)의 속도이다. 해당 객체(컬렉션 또는 배열)이 문자열을 포함한다면 알파벳 순으로 정렬되고, 시간이라면 시간순으로 정렬된다.
객체를 저장하는 배열의 정렬 기준 설정하는 방법
Comparable interface를 이용한 정렬
comparator를 통한 정렬 : 객체에 여러 멤버 변수들이 존재하고, 매번 다른 정렬 기준으로 정렬하고 싶을 때 사용.
sort API의 2번째 파라미터로 이터클래스 객체를 전달한다. 해당 객체는 비교할 두 객체를 인자로 받아서 커피의 price를 가져와 Integer클래스에 정의된 compare함수로 두 값을 비교한다. 첫번째에서 두번째를 뺀다. 양수일 때 자리 교환이 일어난다! 따라서 a, b return a-b; 는 오름차순을 의미한다! c1.price == c2.price : 0을 리턴 c1.price < c2.price : 음수 리턴 c1.price > c2.price : 양수 리턴
람다식을 이용해 2번 Comparator 코드를 줄일 수 있다.
위의 코드는 아래로 고칠 수 있다.
Last updated