122

둘 다 구현하는 클래스를 보았습니다.유사한비교 측정기. 이것은 무엇을 의미 하는가? 나는 왜 다른 것을 사용합니까?


  • 그들에 대한 javadoc을 읽었습니까? 그것은 매우 다른 것을 분명히 설명합니다. - skaffman
  • 비교할 수있는 비교기는 무엇이며 비교할만한 비교기는 언제 사용해야합니까? 이것들을 알기 위해서는이 링크를 읽으십시오. 이것은 그들의 행동과 사용법을 이해하는 데 도움이 될 것입니다.http://iandjava.blogspot.in/2012/10/comparable-and-comparator.html - RockStar
  • 이것은 좋은, 객관적인 대답으로 좋은 질문입니다. 나는 그것이 닫혔다는 것에 당황 스럽다. - Russell Silva
  • 다른 질문StackOverflow에서 이것을 "비교 자와 비교할 수있는 차이점은 무엇입니까?" 의문. 왜 그것이 " 건설적이지 않다 "라고 표시되어 있습니까? Java Newbie로서 이것은 매우 유용한 질문이었습니다! - Pete
  • experts-exchange.com/Programming/Languages/Java/… - akjain

11 답변


211

아래의 텍스트는Comparator 대 Comparable

유사한

비교 가능한 객체는 자신을 다른 객체와 비교할 수 있습니다. 클래스 자체는java.lang.Comparable인터페이스를 사용하여 인스턴스를 비교할 수 있습니다.

비교 측정기

Comparator 객체는 두 개의 다른 객체를 비교할 수 있습니다. 클래스는 인스턴스를 비교하지 않고 다른 클래스의 인스턴스를 비교합니다. 이 비교 클래스는java.util.Comparator인터페이스.



131

구현 중Comparable"나는 나 자신을 다른 물건과 비교할 수있다"는 뜻입니다. 일반적으로 단일 기본 자연 비교가있을 때 유용합니다.

구현 중Comparator"다른 두 개체를 비교할 수 있습니다."라는 의미입니다. 일반적으로 유형의 두 인스턴스를 비교하는 여러 가지 방법이있는 경우에 유용합니다 (예 : 나이, 이름 등으로 사람들을 비교할 수 있습니다.


  • Hello skeet, 비교할 수있는 비교자를 사용하여 코드를 삭제할 수 있습니까? - Mdhar9e
  • @ mdhar9e : 예제가 많이 있습니다. 특정 시나리오로 변환하기가 어렵다면 새로운 질문에 더 많은 정보를 제공하십시오. - Jon Skeet
  • @alireza : 두 번째 단락에 예제가 이미 있습니다. 서로 다른 비교자를 사용하면 동일한 속성 (연령대, 이름 등)별로 동일한 컬렉션을 정렬 할 수 있습니다. 이 작업을 수행하기 만하면됩니다.Person도구Comparable왜냐하면 당신은 다음을 변경할 수 없기 때문에방법두 사람이 비교됩니다. - Jon Skeet
  • @feelgoodandprogramming : 아니, 그들은 다른 정렬 있습니다알고리즘. 세 가지 다른 클래스에서 잠재적으로 세 가지 코드가 있습니다. 1) 엔터티 자체.Person. 2) 비교기.PersonAgeComparator두 개의 서로 다른 엔티티를 비교하고 그 특정 정렬 순서에서 어느 것이 먼저 오는지 결정할 수 있습니다. 3) 엔티티 및 비교 자의 콜렉션을 취하고 순서를 결정하기 위해 비교자를 사용하여 해당 콜렉션을 정렬하는 정렬 코드. - Jon Skeet
  • @RishiKeshPathak : 비교할 단 하나의 명백한 것이 있다면 Comparable을 사용하는 것이 좋습니다. 그리고 심지어 당신도양철통Comparator를 작성하면됩니다. 같은 클래스를 사용하는 두 개의 서로 다른 프로그램이 있고 하나는 나이로 정렬하고 다른 하나는 그냥 이름으로 정렬하려면 적어도하나그 중 Comparator를 사용해야합니다. - Jon Skeet

34

Comparable을 사용하면 클래스가 자체 비교를 구현할 수 있습니다.

  • 안에있다.같은 학급(그것은 종종 장점이다)
  • 있을 수있다하나의 구현(따라서 두 가지 다른 경우를 원한다면 사용할 수 없습니다)

이와 비교하여 Comparator는 외부 비교입니다.

  • 일반적으로 고유 한 인스턴스 (동일한 클래스 또는 다른 위치에 있음)
  • 당신각 구현의 이름 지정너는 물건을 정렬하고 싶은 길과 함께
  • 당신은 비교기를 제공 할 수 있습니다.통제하지 않는 클래스들
  • 구현은최초의 객체가 null의 경우에서도 사용할 수있다

두 가지 구현 모두에서당신이 비교하고 싶은 것을 선택하십시오.. generics를 사용하면 선언 할 수 있고 컴파일 타임에 검사 할 수 있습니다. 이렇게하면 안전성이 향상되지만 적절한 값을 결정하는 것도 어려움입니다.

지침으로, 나는 일반적으로 그 객체가 비교 될 수있는 가장 일반적인 클래스 또는 인터페이스를 사용한다. 모든 사용 사례에서 내가 상상 한 ... 매우 정확한 정의는 아니다! :-(

  • Comparable<Object>컴파일 타임에 모든 코드에서 사용할 수 있습니다 (필요하다면 좋음, 그렇지 않으면 컴파일 타임 오류가 느슨합니다). 당신의 구현은 객체에 대처해야하고 필요에 따라 강력한 방식으로 캐스트해야합니다.
  • Comparable<Itself>반대로 매우 엄격합니다.

재밌 네요, 하위 클래스를 하위 클래스로 만들 때, 하위 클래스도 Comparable이어야하고 그것에 대해 강해야합니다 (또는 Liskov Principle을 깨뜨리고 런타임 오류를 줄 수 있어야합니다).


18

java.lang.Comparable

  1. 구현Comparable인터페이스, 클래스는 단일 메소드를 구현해야합니다.compareTo()

    int a.compareTo(b)

  2. 인스턴스를 정렬하려는 클래스를 수정해야합니다. 클래스 당 하나의 정렬 순서 만 만들 수 있습니다.

java.util.Comparator

  1. Comparator 인터페이스를 구현하려면 클래스가 단일 메소드를 구현해야합니다.compare()

    int compare (a,b)

  2. 인스턴스를 정렬하려는 클래스와 별도로 클래스를 작성합니다. 따라서 여러 클래스별로 여러 정렬 순서를 만들 수 있습니다.


14

Comparable예를 들어 데이터 객체가 자연 순서가있는 경우와 같이 데이터 객체에 대한 기본 순서를 제공하기위한 것입니다.

에이Comparator특정 용도로 주문 자체를 나타냅니다.


7

Comparable보통 선호된다. 그러나 때로는 이미 구현 된 클래스가 있습니다.Comparable,하지만 당신은 다른 속성을 정렬하고 싶습니다. 그럼 당신은 강제로Comparator.

일부 수업은 실제로 제공합니다.Comparators일반적인 경우들; 예를 들어,Strings는 기본적으로 정렬 할 때 대 / 소문자를 구분하지만 정적Comparator전화 한CASE_INSENSITIVE_ORDER.


  • Comparable이 선호되는 것에 동의하지 않습니다. 어떤 객체는 자연수, 즉 숫자, 즉 숫자, 즉 자연수, 실수, 날짜 등을가집니다. 그러나 문자열과 같은 상대적으로 원시적 인 객체조차도 보편적으로 적용 가능한 순서가 없습니다. 응용 프로그램 도메인 모델의 엔티티와 같이 더 복잡한 객체의 경우, Comparable 구현은 대개 실수입니다. 그들의 많은 속성 때문에 어떤 주문이 가장 자주 필요한지 예상하기가 어렵습니다. - erickson

6

Comparator와 Comparable 사이의 차이점은 다음과 같습니다.

  1. 이 두 가지의 논리적 차이점을 알게되면 Java의 Comparator는 제공된 두 객체를 비교하며 Comparable 인터페이스는 "this"참조를 지정된 객체와 비교합니다.

  2. Java에서의 Comparable은 객체의 자연 순서를 구현하는 데 사용됩니다. Java API String에서 Date 및 래퍼 클래스는 Comparable 인터페이스를 구현합니다.

  3. 어떤 클래스가 Java에서 Comparable 인터페이스를 구현하면 List 또는 Array 객체의 컬렉션을 Collections.sort () 또는 Array.sort () 메서드를 사용하여 자동으로 정렬 할 수 있으며 CompareTo 메서드로 정의 된 자연 순서에 따라 객체가 정렬됩니다.

  4. Comparable를 Java로 구현하고있는 객체는, Comparator를 지정하지 않아, 소트 된 맵의 키 또는 TreeSet 등의 소트 세트의 요소로서 사용할 수 있습니다.

사이트 : Java에서 Comparator와 Comparable을 사용하는 방법? 예를 들어

더 읽기 :Java에서 Comparator와 Comparable을 사용하는 방법? 예를 들어


5

Comparable자연 순서가있는 객체 용입니다. 객체 자체는 그것이 어떻게 주문되는지를 안다.

Comparator자연 순서가없는 객체 또는 다른 순서를 사용하려는 객체에 사용됩니다.


3

Comparator와 Comparable 인터페이스 간의 차이점

Comparable다른 개체와 함께 사용하여 자체를 비교하는 데 사용됩니다.

Comparator두 데이터 유형을 비교하는 데 사용됩니다. 객체입니다.


2

당신이 볼 경우이 둘 사이의 논리적 인 차이는ComparatorJava에서 제공되는 두 객체를 비교하고,Comparable인터페이스는 "this"참조를 지정된 객체와 비교합니다.

ComparableJava에서 객체의 자연 순서를 구현하는 데 사용됩니다. Java API String에서 Date 및 래퍼 클래스가 구현됩니다.Comparable인터페이스.

클래스가 구현되고있는 경우ComparableJava에서 인터페이스 다음 해당 개체의 컬렉션 중 하나List또는Array를 사용하여 자동으로 정렬 할 수 있습니다.Collections.sort()또는Array.sort()메소드와 객체는 다음에 정의 된 자연 순서에 따라 정렬됩니다.compareTo방법.

구현하는 객체ComparableJava에서 정렬 된 맵의 키 또는 정렬 된 세트의 요소로 사용할 수 있습니다TreeSet, 아무 것도 지정하지 않고Comparator.


0

Comparable 및 Comparator를 구현하기위한 내 주석 lib :

public class Person implements Comparable<Person> {         
    private String firstName;  
    private String lastName;         
    private int age;         
    private char gentle;         

    @Override         
    @CompaProperties({ @CompaProperty(property = "lastName"),              
        @CompaProperty(property = "age",  order = Order.DSC) })           
    public int compareTo(Person person) {                 
        return Compamatic.doComparasion(this, person);         
    }  
} 

더 많은 예제를 보려면 링크를 클릭하십시오.compamatic


  • stackoverflow에 오신 것을 환영합니다. 이 질문은 낡았 고 이미 대답되었습니다. 일반적으로 응답이 이전 답변에 비해 상당히 새로운 내용이나 다른 내용을 제공하지 않으면 부실 항목을 다시 시작하지 않는 것이 가장 좋습니다. - oers

연결된 질문


관련된 질문

최근 질문