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를 정의합니다 . - 시스템 클래스 제어 할 수없는 클래스에 대한 비교 방법을 제공합니다. 예를 들어 길이를 기준으로 비교 한 문자열 비교기를 정의 할 수 있습니다.
- 전략 패턴 매개 변수로 전달할 수있는 객체로 알고리즘을 표현하고 데이터 구조에 저장하는 등의 상황 인 전략 패턴 을 구현합니다.
- 다중 비교 . 무언가를 정렬하는 여러 가지 방법을 제공합니다. 예를 들어 Person 클래스를 이름, ID, 나이, 키 등으로 정렬 할 수 있습니다
클래스 객체에 하나의 자연 정렬 순서가있는 경우 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_ORDER
comparator를 정의합니다 .
두 접근 방식의 차이점은 다음과 같은 개념에 연결될 수 있습니다.
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 () 메서드에서 하나의 논리 만 가질 수 있습니다 .