[java] compare ()와 compareTo ()의 차이점은 무엇입니까?

Java compare()compareTo()메소드 의 차이점은 무엇입니까 ? 그 방법들이 같은 대답을하나요?



답변

에서 JavaNotes :

  • a.compareTo(b):
    Comparable 인터페이스 : 값을 비교하고 값이보다 작거나 같거나 큰지 여부를 나타내는 int를 반환합니다.
    클래스 객체에 자연스러운 순서 가있는 경우 Comparable<T>인터페이스를 구현 하고이 메서드를 정의합니다. 자연스러운 순서가 구현 된 모든 Java 클래스 Comparable<T>-예 : String, 래퍼 클래스 ,BigInteger

  • compare(a, b):
    비교기 인터페이스 : 두 개체의 값을 비교합니다. 이는 일부로서 구현되는 Comparator<T>인터페이스 및 일반적인 사용과 같은 방법에 전달이를 구현하는 하나 개 이상의 작은 유틸리티 클래스를 정의하는 sort()거나 같은 데이터 구조를 정렬하여 사용 TreeMap하고TreeSet . 다음에 대한 Comparator 개체를 만들 수 있습니다.

    • 다중 비교 . 무언가를 정렬하는 여러 가지 방법을 제공합니다. 예를 들어 Person 클래스를 이름, ID, 나이, 키 등으로 정렬 할 수 있습니다 sort(). 메서드 에 전달할 이들 각각에 대해 Comparator를 정의합니다 .
    • 시스템 클래스 제어 할 수없는 클래스에 대한 비교 방법을 제공합니다. 예를 들어 길이를 기준으로 비교 한 문자열 비교기를 정의 할 수 있습니다.
    • 전략 패턴 매개 변수로 전달할 수있는 객체로 알고리즘을 표현하고 데이터 구조에 저장하는 등의 상황 인 전략 패턴 을 구현합니다.

클래스 객체에 하나의 자연 정렬 순서가있는 경우 compare ()가 필요하지 않을 수 있습니다.


http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html의 요약

비교
가능 비교 가능한 객체는 자신을 다른 객체와 비교할 수 있습니다.

비교기
비교기 객체는 두 개의 다른 물체를 비교할 수있다. 클래스는 인스턴스를 비교하지 않고 다른 클래스의 인스턴스를 비교합니다.


사용 사례 컨텍스트 :

비슷한 인터페이스

는 방법과 동일 ==!= 사업자 평등 / 불평등에 대한 테스트를하지만, 상대 값을 테스트 할 수있는 방법을 제공하지 않습니다 .
일부 클래스 (예 : String 및 자연스러운 순서를 가진 기타 클래스) Comparable<T>compareTo()메서드 를 정의하는 인터페이스를 구현합니다 . 또는 메소드 와 함께 사용하려는 경우 클래스에서
구현 Comparable<T>하고 싶을 것입니다 .Collections.sort()Arrays.sort()

Comparator 개체 정의

Comparators를 만들어 모든 클래스에 대해 임의의 방식 으로 정렬 할 수 있습니다 .
예를 들어 String클래스는 CASE_INSENSITIVE_ORDERcomparator를 정의합니다 .


두 접근 방식의 차이점은 다음과 같은 개념에 연결될 수 있습니다.
Ordered Collection :

컬렉션이 주문되면 특정 (무작위 Hashtable가 아닌 ) 순서로 컬렉션에서 반복 할 수 있습니다 (a 는 순서 가 지정되지 않음).

자연스러운 순서를 가진 컬렉션 은 단순히 정렬되는 것이 아니라 정렬 됩니다. 자연스러운 순서를 정의하는 것은 어려울 수 있습니다! ( 자연스러운 문자열 순서대로 ).


코멘트 에서 HaveAGuess 가 지적한 또 다른 차이점 은 다음과 같습니다.

  • Comparable 구현 중이며 인터페이스에서 보이지 않으므로 정렬 할 때 어떤 일이 발생할지 실제로 알 수 없습니다.
  • Comparator 주문이 잘 정의 될 것이라는 확신을줍니다.

답변

compareTo()Comparable인터페이스 에서 가져온 것 입니다.

compare()Comparator인터페이스 에서 가져온 것 입니다.

두 방법 모두 동일한 작업을 수행하지만 각 인터페이스는 약간 다른 컨텍스트에서 사용됩니다.

에 Comparable 인터페이스를 구현하는 클래스의 객체에 자연 순서를 부과하는 데 사용됩니다. 이 compareTo()방법을 자연 비교 방법이라고합니다. 비교기 인터페이스를 구현하는 클래스의 오브젝트에 전체 순서를 부과하는 데 사용됩니다. 자세한 내용은 각 인터페이스를 사용하는 정확한시기에 대한 링크를 참조하십시오.


답변

유사점 :
둘 다 두 개체를 비교하는 사용자 지정 방법입니다.
둘 다 int두 개체 간의 관계를 설명하는 반환 합니다.

차이점 :
이 방법 compare()Comparator인터페이스 를 구현하는 경우 구현해야하는 방법입니다 . 두 개체를 메서드에 전달할 수 int있으며 관계를 설명하는 반환합니다 .

Comparator comp = new MyComparator();
int result = comp.compare(object1, object2);

이 메서드 compareTo()Comparable인터페이스 를 구현하는 경우 구현해야하는 메서드입니다 . 개체를 유사한 유형의 개체와 비교할 수 있습니다.

String s = "hi";
int result = s.compareTo("bye");

요약 :
기본적으로 사물을 비교하는 두 가지 방법입니다.


답변

방법이 같은 답을 줄 필요는 없습니다. 그것은 당신이 그들을 부르는 객체 / 클래스에 달려 있습니다.

어떤 단계에서 비교하고 싶은 자신의 클래스를 구현하는 경우 Comparable 인터페이스를 구현하고 그에 따라 compareTo () 메서드를 구현할 수 있습니다.

Comparable 인터페이스를 구현하지 않는 API의 일부 클래스를 사용하고 있지만 여전히 비교하고 싶은 경우. 즉 정렬을 위해. Comparator 인터페이스를 구현하는 고유 한 클래스를 만들고 compare () 메서드에서 논리를 구현할 수 있습니다.


답변

Comparable 인터페이스에는 compareTo(obj)하나의 인수 만 취하고 동일한 클래스의 다른 인스턴스 또는 객체와 자신을 비교 하는 메서드가 포함되어 있습니다 .

Comparator 인터페이스에는 compare(obj1,obj2)두 개의 인수를 사용 하는 메서드가 포함되어 있으며 동일하거나 다른 클래스의 두 개체 값을 비교합니다.


답변

compareTo(T object)

java.lang.Comparable 인터페이스에서옵니다.이 객체를 다른 객체와 비교하여이 객체가 더 작은 경우 음의 int 값, 같으면 0, 다른 것보다 큰 경우 양의 값을 제공하도록 구현됩니다. 이것은보다 편리한 비교 방법이지만 비교하려는 모든 클래스에서 구현되어야합니다.

compare(T obj1, T obj2)

java.util.Comparator 인터페이스에서 제공되며, 다른 클래스의 객체를 비교하는 별도의 클래스에서 구현되어 첫 번째 객체가 작 으면 음의 int 값, 같으면 0, 두 번째 객체보다 큰 경우 양의 값을 제공합니다. 수정할 수 없기 때문에 클래스가 compareTo ()를 구현할 수 없을 때 필요합니다. 또한 객체를 비교하는 다른 방법을 원할 때도 사용됩니다 (예 : 이름 또는 나이 기준).


답변

Comparator를 사용 하면 클래스에 대해 n 개의 비교 논리를 작성할 수 있습니다 .

자동차 클래스

자동차 모델 번호를 기준으로 비교할 Comparator 클래스를 가질 수 있습니다. 자동차 연식을 기준으로 비교할 Comparator 클래스를 사용할 수도 있습니다.

자동차 등급

public class Car  {

    int modelNo;

    int modelYear;

    public int getModelNo() {
        return modelNo;
    }

    public void setModelNo(int modelNo) {
        this.modelNo = modelNo;
    }

    public int getModelYear() {
        return modelYear;
    }

    public void setModelYear(int modelYear) {
        this.modelYear = modelYear;
    }

}

모델 번호에 따른 비교기 # 1

public class CarModelNoCompartor implements Comparator<Car>{

    public int compare(Car o1, Car o2) {

        return o1.getModelNo() - o2.getModelNo();
    }

}

모델 연도 기준 비교기 # 2

public class CarModelYearComparator implements Comparator<Car> {

    public int compare(Car o1, Car o2) {

        return o1.getModelYear() - o2.getModelYear();
    }

}

그러나 이것은 Comparable 인터페이스 의 경우 불가능합니다 .

Comparable 인터페이스의 경우 compareTo () 메서드에서 하나의 논리 만 가질 수 있습니다 .