[Java] Comparable 구현
박싱된 기본 타입 클래스의 compare
이용하기
자바 7부터 박싱된 기본 타입 클래스에서 정적 메서드인 compare
를 지원한다.
@Override
public int compareTo(PhoneNumber pn) {
int result = Short.compare(areaCode, pn.areaCode);
if (result == 0) {
result = Short.compare(prefix, pn.prefix);
if (result == 0) {
result = Short.compare(lineNum, pn.lineNum);
}
}
return result;
}
Comparator
비교자 생성 메서드 이용하기
private static final Comparator<PhoneNumber> COMPARATOR =
comparingInt((PhoneNumber) pn -> pn.areaCode)
.thenComparingInt(pn -> pn.prefix)
.thenComparingInt(pn -> pn.lineNum);
@Override
public int compareTo(Test o) {
return COMPARATOR.compare(this, pn);
}
주의점
- 비교자(뺄셈)를 이용한 구현의 경우 오버플로우, 부동소수점 계산 방식 등 오류가 발생할 수 있으므로 지양해야 한다.
compareTo
를 이용한 동치 결과와equals
를 이용한 동치 결과가 같을 것을 권장한다. 정렬 기능을 지원하는 컬렉션의 경우 동치 판단을compareTo
로 하기 때문이다. 예를 들어BigDecimal("1.0")
과BigDecimal("1.00")
의equals
동치 결과는false
이지만compareTo
동치 결과는true
이므로HashSet
은 원소를 2개 갖지만 BST인TreeSet
은 1개의 원소를 가지게 된다.
댓글남기기