클래스는 언제 Comparable 및 / 또는 Comparator 여야합니까?


138

ComparableComparator를 모두 구현하는 클래스를 보았습니다 . 이것은 무엇을 의미 하는가? 왜 다른 것을 사용합니까?


18
그들에 대한 javadoc을 읽었습니까? 그것은 다른 것을 매우 명확하게 설명합니다.
skaffman

1
비교 및 비교기 란 무엇이며 비교기 및 비교기를 사용해야하는시기. 이것들을 알고 싶다면이 링크를 읽으십시오. 이것은 그들의 행동과 사용법을 이해하는데 도움이 될 것입니다. http://iandjava.blogspot.in/2012/10/comparable-and-comparator.html
RockStar

6
좋은 객관적인 답변이있는 좋은 질문입니다. 나는 그것이 닫혀있어서 놀랐습니다.
Russell Silva

3
StackOverflow에 대한 다른 질문 은 이것을 "비교기와 비교 가능한 차이점"질문이라고합니다. 왜 "건설적이지 않은"것으로 표시되어 있습니까? 자바 초보자로서 이것은 매우 유용한 질문이었습니다!
Pete

답변:


241

아래 텍스트는 Comparator와 Comparable의 내용입니다.

유사한

비교 가능한 객체는 다른 객체와 자신을 비교할 수 있습니다. 인스턴스 자체 java.lang.Comparable를 비교 하려면 클래스 자체가 인터페이스를 구현해야합니다 .

비교기

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


비교기 및 비교기의 사용법에 대한 자세한 설명 : sysdotoutdotprint.com/index.php/2017/03/28/…
mel3kings

2
또 다른 좋은 기사 : codecramp.com/java-comparable-vs-comparator
EMM

@ mel3kings-더 이상 링크에 액세스 할 수 없습니다.
Gaurav

152

구현 Comparable은 " 다른 객체와 자신을 비교할 수 있습니다 "를 의미 합니다. 이는 일반적으로 단일 기본 비교가있을 때 유용합니다.

구현 Comparator은 " 다른 두 객체를 비교할 수 있습니다 "를 의미 합니다. 이는 일반적으로 유형의 두 인스턴스를 비교하는 여러 방법이있을 때 유용 합니다. 예를 들어 연령, 이름 등으로 사람을 비교할 수 있습니다.


1
안녕하세요 skeet, 비교 및 ​​비교기를 사용하여 코드를 삭제하십시오.
Mdhar9e

5
@ mdhar9e : 주위에 많은 예제가 있습니다-특정 시나리오로 번역하기가 어렵다면 새로운 질문에 더 많은 정보를 제공하십시오.
Jon Skeet

2
@alireza : 두 번째 단락에서 이미 예를 들었습니다. 다른 비교기를 사용하면 다른 속성 (연령, 이름 등)으로 동일한 모음 (사람)을 정렬 할 수 있습니다. Person구현 만으로 그렇게 할 수는 없습니다.Comparable두 사람을 비교 하는 방법 을 변경할 수 없기 때문에 할 수는 없습니다 .
존 스키트

1
@feelgoodandprogramming : 아니요, 다른 정렬 알고리즘 입니다. 여기에는 세 가지 다른 클래스로 잠재적으로 세 가지 코드가 있습니다. 1) 엔티티 자체Person . 2) 비교기, 예 PersonAgeComparator를 들어 두 개의 다른 엔티티를 비교할 수 있고 특정 정렬 순서에서 가장 먼저 오는 항목을 결정할 수 있습니다. 3) 정렬 코드는 엔티티와 비교기를 수집하고 비교기를 사용하여 해당 수집을 정렬하여 순서를 결정합니다.
존 스키트

2
@RishiKeshPathak : 비교할 명백한 단 하나의 것이 있다면 Comparable을 사용하는 것이 더 좋습니다. 그런 다음에도 비교기를 작성할 수 있습니다 . 동일한 클래스를 사용하는 두 개의 다른 프로그램이 있고 하나는 나이 만 기준으로 정렬하고 다른 하나 는 이름 만 기준으로 정렬하려는 경우 적어도 하나 는 비교기를 사용해야합니다.
Jon Skeet

38

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

  • 그것은 같은 클래스에 있습니다 (종종 장점입니다)
  • 하나의 구현 만 있을 수 있습니다 (따라서 두 개의 다른 경우를 원하면 사용할 수 없습니다)

비교하자면, Comparator는 외부 비교입니다.

  • 일반적으로 고유 한 인스턴스에 있습니다 (동일한 클래스 또는 다른 위치에 있음)
  • 당신 은 당신이 물건을 정렬하려는 방식으로 각 구현의 이름지정합니다
  • 통제하지 않는 수업에 대해 비교기를 제공 할 수 있습니다.
  • 첫 번째 객체가 null 인 경우에도 구현을 사용할 수 있습니다

두 가지 구현 모두에서 비교할 대상을 계속 선택할 수 있습니다 . 제네릭을 사용하면 선언 할 수 있으며 컴파일 타임에 확인할 수 있습니다. 이것은 안전성을 향상 시키지만 적절한 가치를 결정하는 것은 어려운 일입니다.

지침으로, 나는 일반적으로 그 객체를 비교할 수있는 가장 일반적인 클래스 또는 인터페이스를 사용합니다. :-(

  • Comparable<Object>컴파일 타임에 모든 코드에서 사용할 수 있습니다 (필요한 경우 좋거나 그렇지 않은 경우 나쁘고 컴파일 타임 오류를 잃습니다). 구현은 객체에 대처하고 필요에 따라 강력한 방식으로 캐스팅해야합니다.
  • Comparable<Itself> 반대로 매우 엄격합니다.

재밌게도 서브 클래스에서 서브 클래스로 서브 클래스 할 때 서브 클래스는 또한 비교 가능하고 견고해야합니다.


20

java.lang.Comparable

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

    int a.compareTo(b)

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

java.util.Comparator

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

    int compare (a,b)

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

14

Comparable 데이터 개체의 기본 순서를 제공하기위한 것입니다 (예 : 데이터 개체의 자연스러운 순서).

A Comparator는 특정 용도에 대한 주문 자체를 나타냅니다.


8

Comparable일반적으로 선호됩니다. 그러나 때로는 클래스가 이미 구현 Comparable했지만 다른 속성을 정렬하려고합니다. 그런 다음Comparator .

일부 클래스는 실제로 Comparators일반적인 경우를 제공 합니다. 예를 들어, Strings는 정렬시 기본적으로 대소 문자를 구분하지만 Comparator이라는 정적도 있습니다 CASE_INSENSITIVE_ORDER.


7
필자가 필적 할만한 Comparable에 동의하지는 않습니다. 일부 객체는 자연 순서, 즉 모든 숫자, 자연수, 실수, 날짜 등 모든 형태의 자연 순서가 강합니다. 그러나 문자열과 같은 상대적으로 다른 기본 개체도 보편적으로 적용 가능한 순서가 없습니다. 응용 프로그램 도메인 모델의 엔터티와 같이 더 복잡한 개체의 경우 Comparable을 구현하는 것은 일반적으로 실수입니다. 그들의 많은 속성으로 인해 어떤 순서가 가장 자주 요구되는지 예측하기가 너무 어렵습니다.
erickson

6

웹에서 찾은 Comparator와 Comparable의 차이점은 다음과 같습니다.

  1. 이 두 가지의 논리적 차이점은 Java에서 Comparator가 제공 한 두 개체를 비교하는 반면 Comparable 인터페이스는 "this"참조를 지정된 개체와 비교하는 것입니다.

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

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

  4. Java에서 Comparable을 구현하는 객체는 Comparator를 지정하지 않고 정렬 된 맵의 키 또는 정렬 된 세트 (예 : TreeSet)의 요소로 키로 사용할 수 있습니다.

site : Java에서 Comparator 및 Comparable을 사용하는 방법은 무엇입니까? 예를 들어

더 읽기 : Java에서 Comparator 및 Comparable을 사용하는 방법은 무엇입니까? 예를 들어


5

Comparable자연스러운 순서를 가진 물체를위한 것입니다. 객체 자체는 주문 방법을 알고 있습니다.
Comparator자연스러운 순서가 없거나 다른 순서를 사용하려는 경우에 사용됩니다.


4

비교기와 인터페이스의 차이점

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

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


2

이 두 가지의 논리적 차이점은 ComparatorJava에서 제공된 두 개체를 Comparable비교 하는 반면 인터페이스는 "this"참조를 지정된 개체와 비교하는 것입니다.

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

모든 클래스가 구현하는 경우 Comparable다음 자바 객체의 집합을 인터페이스 중 하나 List또는 Array사용하여 자동으로 정렬 할 수 있습니다 Collections.sort()또는 Array.sort()방법 및 개체에 의해 정의가 자연 순서에 따라 정렬됩니다 compareTo방법.

ComparableJava 로 구현 된 객체 는 정렬 맵의 키 또는 정렬 된 세트의 요소로 TreeSet지정할 수 Comparator있습니다.


0

Comparable 및 Comparator를 구현하기위한 주석 라이브러리 :

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);         
    }  
} 

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


3
stackoverflow에 오신 것을 환영합니다. 이 질문은 오래되었으며 이미 답변되었습니다. 일반적으로 응답이 이전 답변보다 현저히 새롭거나 다른 것으로 기여하지 않는 한 오래된 스레드를 부활시키지 않는 것이 가장 좋습니다.
oers
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.