Development Tip

표준 API에 자연 비교기가 존재합니까?

yourdevel 2021. 1. 10. 19:38
반응형

표준 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

반응형