표준 API에 자연 비교기가 존재합니까?
객체의 자연스러운 순서 나 사용자 지정 순서를 사용할 수있는 전략 패턴의 일부로 비교기가 필요합니다. 자연스러운 주문의 경우 간단한 비교기를 작성했습니다.
private static class NaturalComparator<T extends Comparable<? super T>> implements Comparator<T> {
@Override
public int compare(T o1, T o2) {
return o1.compareTo(o2);
}
}
충분히 간단 해 보이지만 누구든지 표준 API에서 알고 있는지 궁금합니다. 나는 TreeMap을 보았고 그러한 클래스없이 그것을 수행하기 때문에 그 코드가 작성되었을 때 명백한 대답은 아니오 일 것이지만 아마도 나중에 추가되었을 것입니다.
Java 8의 Comparator에 추가 :
static <T extends Comparable<? super T>> Comparator<T> naturalOrder()
예를 들어 다음과 같이 사용하십시오.
Comparator<Double> natural = Comparator.<Double>naturalOrder();
return natural.compare(1.0, 1.1));
예, JDK에는 확실히 있습니다! 여기있어:
Collections.reverseOrder(Collections.reverseOrder())
농담입니다. (하지만 사실입니다. (실제로 사용하지 마세요. (Ever.)))
JDK에는 없지만 ComparableComparator 라고 하며 Spring , Apache Commons , Hibernate 및 기타 여러 프레임 워크에 존재 합니다.
Java의 기본 비교기에 익숙하지 않지만 분명히 Comparator to compareTo는 종종 단순한 래퍼입니다.
표준 API에는 일반적인 "자연 순서"가 없지만 숫자와 같은 특정 내장 유형에는 compareTo가 구현되어 자연 순서가됩니다.
TreeMap
그리고 TreeSet
당신이에 넣어 객체가 Comparable가 구현되어 있지 않은 경우, 모든는 RuntimeException을 던져해야합니다. 따라서 예를 들어 다른 컬렉션이 아닌 문자열이나 숫자를 넣을 수 있습니다.
의 코드는 TreeMap
사용할 수없는 경우 비교기를 사용하지 않고 compareTo
대신 사용 합니다. 를 사용하려면 예외의 소스 인 compareTo
으로 캐스트합니다 Comparable
.
private int compare(K k1, K k2) {
return (comparator==null ? ((Comparable <K>)k1).compareTo(k2)
: comparator.compare((K)k1, (K)k2));
}
클래스에 자연스러운 순서가 있으면 각 클래스에 대한 구현이 Comparable
아닌 Java에서 구현하는 것이 더 일반적이라고 생각합니다 Comparator
.
따라서 문제의 객체에 자연스러운 순서가 정의되어 있으면 구현 Comparable
해야하며 compareTo
메서드를 정의 해야합니다 . 을 찾을 필요가 없습니다 Comparator
. java.util의 대부분의 클래스는 Comparator
특정 순서가 부과 되는 경우 선택 사항을 취하거나 compareTo
다른 순서가 지정되지 않은 경우 단순히 객체 를 호출하려고 시도 합니다.
짧게 말하면 Comparable
, 클래스에 자연스러운 순서를 적용하고 싶을 때마다 구현 하고, 자연스러운 순서가 Comparator
아닌 다른 것을 원할 때만 사용하십시오 .
참조 URL : https://stackoverflow.com/questions/3241063/does-a-natural-comparator-exist-in-the-standard-api
'Development Tip' 카테고리의 다른 글
rm은 스크립트에서 와일드 카드로 파일을 삭제하지 못하지만 쉘 프롬프트에서 작동합니다. (0) | 2021.01.10 |
---|---|
Regex.Replace를 사용하여 문자열에서 숫자를 제거하는 방법은 무엇입니까? (0) | 2021.01.10 |
경고 대화 상자에 두 개의 편집 텍스트 필드를 추가하는 방법 (0) | 2021.01.10 |
ActionBar의 오버플로 버튼 색상 변경 (0) | 2021.01.10 |
d3.js & nvd3.js — y 축 범위 설정 방법 (0) | 2021.01.10 |