728x90
안녕하세요!
JAVA에서는 객체간 비교를 하기 위해 Comparable/Comparator 인터페이스를 많이 사용합니다.
단순 객체간 비교를 할 때는 어렵지 않은데, 정렬에서 이 인터페이스의 compareTo를 구현할 때는 구현할 때마다 헷갈리는 것 같습니다.
(머리가 좋으신 분들은 헷갈리지 않을 수 있습니다..)
더이상 헷갈리면 안되겠다 싶어서 핀 선생님의 도움을 받아 차근히 공부를 했고, 오늘은 제가 이해한 방법을 한 번 공유해볼까 합니다.
외워야할 것들
- 비교대상 : A, B
- 공식 : A를 기준으로 A를 앞에 보내고 싶으면 -1, A를 뒤로 보내고 싶으면 1 (같으면 0 이지만 이건 딱히 헷갈리지 않으니 제외)
- 오름차순 : 작은 수가 앞에 옴 / 내림차순 : 큰 수가 앞에 옴
- point : 함수가 완성되기 전까지는 순서가 정해진게 아니므로 대소비교 경우의 수를 모두 구현해줘야 하고, Comparable인 경우 A는 this가 됩니다.
이 네 가지를 기억해두고 compareTo를 구현해보겠습니다.
// 1. 오름차순 : 오름차순은 작은 수가 앞에 옵니다.
public int compare(final Integer a, final Integer b) {
if (a > b) { // 만약 a가 b보다 크다면, 뒤로 가야 합니다.
return 1; // a를 뒤로 보내고 싶으면 1
}
if (a < b) { // 만약 a가 b보다 작다면, 앞으로 오면 됩니다.
return -1; // a를 앞으로 보내고 싶으면 -1
}
return 0;
}
// 2. 내림차순 : 내림차순은 큰 수가 앞에 옵니다.
public int compare(final Integer a, final Integer b) {
if (a > b) { // 만약 a가 b보다 크다면, 앞으로 와야 합니다.
return -1; // a를 앞으로 보내고 싶으면 -1
}
if (a < b) { // 만약 a가 b보다 작다면, 뒤로 가야 합니다.
return 1; // a를 뒤로 보내고 싶으면 1
}
return 0;
}
많은 라이브러리들이 이를 뺄셈으로 구현하고 있어서 헷갈리지만, 기본적인 개념은 이렇습니다.
이걸 이해하면 뺄셈을 이해하는 것도 매우 쉬울거리라 생각합니다.
(제가 이해했으면 이걸 보는 분들은 무조건 이해하실 겁니다.)
뺄셈을 이용해서 구현해보겠습니다.
// 1. 오름차순 : 오름차순은 작은 수가 앞에 옵니다.
public int compare(final Integer a, final Integer b) {
return a - b; // a > b가 양수고 / a < b가 음수임을 보장해주는 식
}
// 2. 내림차순 : 내림차순은 큰 수가 앞에 옵니다.
public int compare(final Integer a, final Integer b) {
// 오름차순의 reverse
// -(a - b)
// -a + b
// b - a
return b - a; // a > b가 음수고 / a < b가 양수임을 보장해주는 식
}
간단한게 끝났습니다.
참 쉽죠? ㅎㅎ
혹시 궁금한 게 있다면 댓글 남겨주세요 :)
728x90
'츄Log > 기타 끄적' 카테고리의 다른 글
템플릿 메소드 콜백 패턴(Template Method Callback Pattern) (0) | 2023.12.14 |
---|---|
템플릿 메소드 패턴 (Template Method Pattern) (0) | 2023.12.14 |
Java 스트림 (Stream)의 특징 (1) | 2023.12.08 |
숫자 문자열 비교하기 (JAVA String compareTo) (0) | 2023.12.07 |
Base64 Encoding (2) | 2023.12.06 |