2009-04-27 3 views
7

클래스를 사용할 수있게 만들고 싶습니다. SortedSet | SortedMap.equals와 compareTo가 일치하지 않는 것이 맞습니까?

class MyClass implements Comparable<MyClass>{ 
    // the only thing relevant to comparisons: 
    private final String name; 

    //... 
} 

클래스의 인스턴스는 name 속성으로 정렬되어야합니다.
그러나 똑같은 이름의 인스턴스가 동일한 것으로 간주되기를 원하지 않습니다.

따라서 SortedSet 콘텐츠는 a, a, a, b, c처럼 보일 것입니다. 이 (철학적) 일치 :
모든

먼저 (일반적으로, SortedSet C A, B를 허용 것)? 내가하지 재정 equals(...)hashCode()을 수행 할 때

그렇다면은, 내가 예측할 수없는 행동을 기대해야합니까?

편집 :
미안 해요, 내 질문은 일관성이 보인다
가 나는 내부 개념으로이 을 허용하지 않습니다을 설정 여러 "동일한" 값 넣고 싶다.
내 질문에 더 이상 회신하지 마십시오.
이미 답변 해 주신 모든 분들께 감사드립니다.

+0

다른 Collection 유형을 사용하지 않는 이유는 무엇입니까? –

+0

예, google-collection-API의 다중 세트 | MultiMap이 좋을 것 같습니다. Sun, aehm, Oracle 사람들이 Java collection API에 기능을 추가 할 수 있기를 바랍니다. –

답변

18

질문 : a.compareTo(b) 반환 0 및 a.equals(b) 반환 false을 갖는 것이 합당합니까?

대신 Comparator<MyClass>을 사용합니다. 따라서 내가 알고있는 모든 구현 SortedMap/SortedSet을 작성하면 Comparator을 전달할 수 있습니다.

+0

대답하는 경향이 있습니다. 의미가 없습니다.) 감사합니다. Comparator;) –

+0

올바른 질문입니다. – Joshua

2

Effective Javaequals과 일치 compareTo를 구현하지 않는 경우에 당신이 명확하게 이렇게 표시해야하는 것이 좋습니다

권장 언어는 "주 : 이 클래스는 는 equals와 일관성이있는 자연 순서가 있습니다. "

0

그냥 equals 메소드에서이 코드를 넣어 다시 그것에 대해 생각 해달라고 :

public boolean equals(Object obj) { 
    if (this == obj) return true; 
    if (!(obj instanceof MyClass)) return false; 
    return 0 == this.compareTo((MyClass) obj); 
} 
+0

그러나 equals()를 구현하는 경우 hashcode()도 구현해야합니다. 그렇지 않으면 이상한 일이 발생할 수 있습니다. –

+0

hashCode를 다른 속성이나 비교 가능한 int 값을 반환하는 메서드에 위임 할 수 있습니다. 그러나 해시 코드가 같은 참조인지 아닌지 확인하는 것과 같기 때문에 걱정하지 마세요. 동일한 값을 갖는 것이 아닙니다. – Azder

4

을 대등

를위한 JavaDoc에서 그것은 좋습니다 (필요하지 하지만) 자연 순서는 과 같음을 의미합니다.세트를 분류 (및지도를 분류) 그들은 누구의 자연 주문

을 equals와 일관성이 요소 또는 키와 함께 사용하면 명시 적 비교기는 "이상하게을"행동하지 않고 때문에 그렇게 당신의 경우 equals()와 일치하지 않는 compareTo를 원할 경우 Comparator를 구현하는 클래스를 제공하여 명시 적 비교기를 대신 사용하는 것이 좋습니다.

그렇다면 equals (...) 및 hashcode()를 재정의하지 않으면 예기치 않은 동작이 발생해야합니까?

여전히 equals() 및 hashcode()를 재정의해야합니다. equals()와 hashcode()가 compareTo와 일치하는지 여부는 다른 문제입니다.

관련 문제