클래스는 언제 비교 및/또는 비교기 여야합니까? [닫은
-
10-07-2019 - |
문제
나는 둘 다 구현하는 수업을 보았다 유사한 그리고 비교기. 이것은 무엇을 의미 하는가? 왜 다른 하나를 사용합니까?
해결책
아래 텍스트는 비교기 대 비교
유사한
비슷한 객체는 다른 객체와 스스로를 비교할 수 있습니다. 클래스 자체는 java.lang.Comparable
인스턴스를 비교할 수 있도록 인터페이스.
비교기
비교기 객체는 두 가지 다른 객체를 비교할 수 있습니다. 클래스는 인스턴스를 비교하는 것이 아니라 다른 클래스의 인스턴스를 비교하고 있습니다. 이 비교기 클래스는이를 구현해야합니다 java.util.Comparator
상호 작용.
다른 팁
구현 Comparable
수단 "다른 대상과 비교할 수 있습니다."이것은 일반적으로 단일 자연 기본 기본 비교가있을 때 유용합니다.
구현 Comparator
수단 "다른 두 개체를 비교할 수 있습니다."이것은 일반적으로 유형의 두 인스턴스를 비교하는 여러 가지 방법이있을 때 유용합니다. 예를 들어 사람들을 연령, 이름 등으로 비교할 수 있습니다.
비교할 수있는 클래스는 자체 비교를 구현할 수 있습니다.
- 들어 왔어요 같은 수업 (종종 이점입니다)
- 있을 수있다 하나의 구현 만 (따라서 두 가지 다른 경우를 원한다면 사용할 수 없습니다)
이에 비해 비교기는 외부 비교입니다.
- 일반적으로 고유 한 인스턴스에 있습니다 (동일한 클래스 또는 다른 곳에서)
- 너 각 구현의 이름을 지정하십시오 당신이 정렬하고 싶은 방식으로
- 비교기를 제공 할 수 있습니다 당신이 통제하지 않는 수업
- 구현은입니다 첫 번째 객체가 null이라도 사용할 수 있습니다
두 구현 모두에서도 여전히 가능합니다 비교하고 싶은 것을 선택하십시오. 제네릭을 사용하면 그렇게 선언하고 컴파일 타임에 확인할 수 있습니다. 이것은 안전을 향상 시키지만 적절한 가치를 결정하는 것은 또한 어려운 일입니다.
가이드 라인으로서, 나는 일반적으로 그 객체를 비교할 수있는 가장 일반적인 클래스 또는 인터페이스를 사용합니다. :-(
Comparable<Object>
컴파일 타임에서 모든 코드에서 사용할 수 있습니다 (필요한 경우 양호하거나 그렇지 않은 경우 나쁘고 컴파일 타임 오류가 느슨 함); 구현은 객체에 대처하고 필요에 따라 강력한 방식으로 캐스트해야합니다.Comparable<Itself>
반대로 매우 엄격합니다.
재미있는, 서브 클래스로 서브 클래스를 하위 클래스로 할 때, 서브 클래스는 또한 비교할 수 있고 그것에 대해 강력해야합니다 (또는 Liskov 원칙을 깨고 런타임 오류를 줄 것입니다).
java.lang.comparable
구현
Comparable
인터페이스, 클래스는 단일 메소드를 구현해야합니다compareTo()
int a.compareTo(b)
인스턴스를 정렬하려는 클래스를 수정해야합니다. 따라서 클래스 당 하나의 정렬 시퀀스 만 생성 할 수 있습니다.
java.util.comparator
비교기 인터페이스를 구현하려면 클래스는 단일 방법을 구현해야합니다.
compare()
int compare (a,b)
- 인스턴스를 정렬하려는 클래스와 별도의 클래스를 구축합니다. 수업 당 여러 정렬 시퀀스를 만들 수 있습니다.
Comparable
예를 들어 데이터 객체에 자연 순서가있는 경우 데이터 객체에 대한 기본 순서를 제공하는 것입니다.
ㅏ Comparator
특정 용도로 순서 자체를 나타냅니다.
Comparable
일반적으로 선호됩니다. 그러나 때로는 수업이 이미 구현됩니다 Comparable
, 그러나 다른 속성을 정렬하고 싶습니다. 그런 다음 a를 사용해야합니다 Comparator
.
일부 수업은 실제로 제공합니다 Comparators
일반적인 경우; 예를 들어, String
s는 정렬 할 때 기본적으로 사례에 민감하지만 정적도 있습니다. Comparator
~라고 불리는 CASE_INSENSITIVE_ORDER
.
웹에서 찾은 비교기와 비교할 수있는 차이점은 다음과 같습니다.
이 두 가지 사이의 논리적 차이가 Java의 비교기는 그에게 제공된 두 객체를 비교하는 반면, 비교 가능한 인터페이스는 "이"참조를 지정된 객체와 비교합니다.
Java에서 비교할 수있는 것은 자연스럽게 객체 순서를 구현하는 데 사용됩니다. Java API 문자열에서 날짜 및 래퍼 클래스는 비슷한 인터페이스를 구현합니다.
모든 클래스가 Java에서 비슷한 인터페이스를 구현 한 경우 해당 객체의 수집은 Collections.sort () 또는 Array.sort () 메소드를 사용하여 자동으로 정렬 할 수 있으며 비교 메소드에 의해 정의 된 자연 순서를 기반으로 정렬됩니다.
Java에서 비교할 수있는 객체는 비교기를 지정하지 않고 정렬 된 맵의 키 또는 요소로 사용될 수 있습니다.
사이트 : 비교기를 사용하고 Java에서 비교할 수있는 방법은 무엇입니까? 예를 들어
Comparable
자연 순서가있는 물체를위한 것입니다. 객체 자체는 그것이 어떻게 주문 될 것인지 알고 있습니다.
Comparator
자연 순서가없는 물체 나 다른 순서를 사용하려는 경우입니다.
비교기와 비교 가능한 인터페이스의 차이
Comparable
다른 객체와 함께 사용하여 스스로를 비교하는 데 사용됩니다.
Comparator
두 개의 데이터 유형을 비교하는 데 사용됩니다.
당신이 보이면이 둘 사이의 논리적 차이는 Comparator
Java에서는 그에게 제공된 두 개의 물체를 비교하고 Comparable
인터페이스는 "이"참조를 지정된 객체와 비교합니다.
Comparable
Java에서는 물체의 자연스러운 순서를 구현하는 데 사용됩니다. Java API 문자열, 날짜 및 래퍼 클래스 구현 Comparable
상호 작용.
클래스가 구현되는 경우 Comparable
Java의 인터페이스는 해당 객체를 모으십시오 List
또는 Array
사용하여 자동으로 정렬 할 수 있습니다 Collections.sort()
또는 Array.sort()
메소드와 객체는 정의 된 자연 순서에 따라 정렬됩니다. compareTo
방법.
구현하는 객체 Comparable
Java에서는 정렬 된 맵에서 키로 사용할 수 있습니다. 예를 들어 정렬 된 세트의 요소 TreeSet
, 아무것도 지정하지 않고 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);
}
}
더 많은 예를 보려면 링크를 클릭하십시오. 공정성