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 개체를 만들 수 있습니다.
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 () 메서드에서 하나의 논리 만 가질 수 있습니다 .
이 방법을 사용하는 개체와 공동 작업자의 관계가 다릅니다.
compareTo()Comparable 인터페이스의 메서드 이므로이 인스턴스를 다른 인스턴스와 비교하는 데 사용됩니다.
compare()는 인터페이스 Comparator 의 메서드 이므로 다른 클래스의 두 인스턴스를 서로 비교하는 데 사용됩니다.
원한다면 구현 Comparable은 클래스의 인스턴스를 쉽게 비교할 수 있음을 의미합니다.
구현 Comparator은 인스턴스가 다른 클래스의 다른 객체를 비교하는 데 적합하다는 것을 의미합니다.
compareTo()다른 개체와 비교하기 위해 한 개체에서 호출됩니다.
compare()두 개의 다른 객체를 비교하기 위해 어떤 객체에서 호출됩니다.
차이점은 실제 비교를 수행하는 논리가 정의되는 곳입니다.
Object Foo를 포함하는 List를 정렬하려면 List의 정렬 방법이이 방법을 사용하고 있기 때문에 Foo 클래스는 Comparable 인터페이스를 구현해야합니다.
다른 두 클래스를 비교하는 Util 클래스를 작성하려면 Comparator 클래스를 구현할 수 있습니다.
직원 테이블
이름, DoB, Salary
Tomas, 1982 년 2 월 10 일, 300
Daniel, 1990 년 3 월 11 일, 400
Kwame, 1998 년 2 월 10 일, 520
대등 당신이 이름을 기준으로 정렬 할 수 또는 연봉에 의해, 예를 들면 - 인터페이스는 하나 개의 기본 필드를 기준으로 객체 예를 들어 종업원의 목록을 정렬 할 수 있습니다 은 compareTo () 메소드
emp1.getName().compareTo(emp2.getName())
이러한 요구 사항에 대한보다 유연한 인터페이스는 Comparator 인터페이스에서 제공하며 유일한 메서드는 compare ()입니다.
public interface Comparator<Employee> {
int compare(Employee obj1, Employee obj2);
}
샘플 코드
public class NameComparator implements Comparator<Employee> {
public int compare(Employee e1, Employee e2) {
// some conditions here
return e1.getName().compareTo(e2.getName()); // returns 1 since (T)omas > (D)an
return e1.getSalary().compareTo(e2.getSalary()); // returns -1 since 400 > 300
}
}
강조해야 할 기술적 측면도 있습니다. 클라이언트 클래스에서 비교 동작 매개 변수화가 필요하고 다음 과 같은 메서드 를 사용할지 Comparable또는 사용할지 궁금해한다고 가정 해 보겠습니다 Comparator.
class Pokemon {
int healthPoints;
int attackDamage;
public void battle (Comparable<Pokemon> comparable, Pokemon opponent) {
if (comparable.compareTo(opponent) > 0) { //comparable needs to, but cannot, access this.healthPoints for example
System.out.println("battle won");
} else {
System.out.println("battle lost");
}
}
}
comparable람다 또는 객체가 될 것이며 포켓몬 comparable의 필드에 액세스 할 수있는 방법이 없습니다 this. ( this람다에서 프로그램 텍스트에 정의 된대로 람다 범위의 외부 클래스 인스턴스를 나타냅니다.) 따라서 이것은 비행하지 않으며Comparator 두 개의 인수와 함께 a를 사용해야합니다 .
Important Answar
String name;
int roll;
public int compare(Object obj1,Object obj2) { // For Comparator interface
return obj1.compareTo(obj1);
}
public int compareTo(Object obj1) { // For Comparable Interface
return obj1.compareTo(obj);
}
여기에서 return obj1.compareTo(obj1)또는 return obj1.compareTo(obj)문은 Object 만 가져옵니다. 프리미티브는 허용되지 않습니다. 예를 들어
name.compareTo(obj1.getName()) // Correct Statement.
그러나
roll.compareTo(obj1.getRoll())
// Wrong Statement Compile Time Error Because roll
// is not an Object Type, it is primitive type.
name은 String Object이므로 작동했습니다. 아래 코드를 사용하는 것보다 학생의 롤 번호를 정렬하려면.
public int compareTo(Object obj1) { // For Comparable Interface
Student s = (Student) obj1;
return rollno - s.getRollno();
}
또는
public int compare(Object obj1,Object obj2) { // For Comparator interface
Student s1 = (Student) obj1;
Student s2 = (Student) obj2;
return s1.getRollno() - s2.getRollno();
}