목차
- Comparator interface - Compare()
- 어떻게 사용해야 할까
- equals 재정의
Comparator interface - Compare()
Comparator 인터페이스를 구현하는 방법과 주석대로 구현 시 오름차순으로 정렬되는 과정을 내 수준에 맞게 학습하려고 한다.
1. Compare(T o1, T o2)
int compare(T o1, T o2);
Compare() 은 Comparator 인터페이스에서 구현해야하는 메서드입니다. 해당 메소드 구현에 따라 정렬 방식이 결정됩니다.
2. Returns
// compare() 주석 발췌
Returns:a negative integer, zero, or a positive integer as
the first argument is less than, equal to, or greater than the second.
- negative integer : o1 < o2 의미
- zero : o1 equal o2 의미
- positive integer : o1 > o2 의미
주석에 따라 메서드 구현 시 오름차순으로 정렬됩니다.
(오름차순으로 정렬되는 이유는 모르겠습니다. 머리가 아파서 도중에 그만뒀습니다.)
return
negative integer : o1이 o2보다 왼쪽에 있고
positve integer : o1이 o2보다 오른쪽에 있어야 합니다.
이 때문에 오름차순으로 정렬됩니다.
3. 알고리즘을 모르니 삽질하자
삽질을 통해 정렬이 되어가는 과정을 알아봅시다.
list.sort(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 > o2 ? 1 : ((o1 < o2) ? -1 : 0);
}
});
거슬러 올라가면 Comparator 구현 시 LegacyMergeSort 혹은 TimSort 를 통해 정렬됩니다.
그래서 o1, o2 로그를 찍어봐도 해당 알고리즘을 모르면 정렬 방법을 이해하기 어려운 것 같습니다.
그래도 일단 찍어보겠습니다. 아래 list 를 오름차순으로 정렬하는 과정의 로그입니다.
2 | 1 | 5 | 3 |
o1=1 o2=2 return -1
o1=5 o2=1 return 1
o1=5 o2=2 return 1
o1=3 o2=2 return 1
o1=3 o2=5 return -1
1. return -1 (negative integer) : o1(1)이 더 o2(2) 왼쪽에 있어야 합니다. 자리를 바꿉니다.
1 | 2 | 5 | 3 |
2. return 1 (positive integer) : o1(5)이 o2(1) 보다 오른쪽에 있어야 합니다. 이미 그렇습니다.
1 | 2 | 5 | 3 |
3. return 1 (positive integer) : o1(5)이 o2(1) 보다 오른쪽에 있어야 합니다. 이미 그렇습니다.
1 | 2 | 5 | 3 |
4. return 1 (positive integer) : o1(3)이 o2(2) 보다 오른쪽에 있어야 합니다. 이미 그렇습니다.
1 | 2 | 5 | 3 |
5. return -1 (negative integer) : o1(3)이 o2(5) 보다 왼쪽에 있어야 합니다. 자리를 바꿉니다.
1 | 2 | 3 | 5 |
2. 어떻게 사용해야 할까
제가 내린 결론은 아래와 같습니다.
- 인터페이스에서 설명한대로 Compare를 구현하여 오름차순으로 정렬된다.
- 내림차순으로 정렬하고 싶다면 일단 인터페이스에서 설명한대로(오름차순) 구현한 뒤, reversed() 를 사용하자.
이게 추후에 코드를 내가 다시 보았을 때나 타인이 보았을 때도 혼란이 덜할 것 같다.
3. equlas 재정의
재정의하는 이유에 대해서는 아주 명확하게 설명해주고 있습니다.
Note that it is always safe not to override Object.equals(Object).
However, overriding this method may, in some cases,
improve performance by allowing programs to determine that two distinct comparators impose the same order.
1. 동등성(equality)을 가질 경우 같은 순서를 적용할 수 있기 때문에 효율적이다.
2. 재정의 안해도 안전하다. (댕꿀)
계획 및 잡담
Comparator - Comparable 인터페이스에 대한 포스팅을 한 편 추가할 예정입니다.
여러 필드를 가진 객체를 특정 기준에 따라 정렬할 일이 생겼고 그 과정에서 Comparator 인터페이스를 사용하였다.
주먹구구식으로 사용했던 나를 반성하며 그리고
이를 알았다면 좀더 클린한 코드를 짤 수 있었던 아쉬움에 포스팅을 남깁니다.
'Java' 카테고리의 다른 글
기본형과 참조형 그리고 래퍼클래스 (0) | 2022.07.17 |
---|---|
this는 왜 사용할까? (0) | 2022.07.15 |
쓰레드 - 2. 동기화 (0) | 2022.07.03 |
쓰레드 - 1. 쓰레드란? (0) | 2022.07.03 |
JAVA - 함수 호출 방식 call by value, call by reference (0) | 2022.06.29 |