Java에서 * 모든 * 클래스의 모든 인스턴스에 대해 전체 순서 지정
문제
다음 코드가 Comparator의 Javadoc에 제공된 모든 조건을 보장하는지 확실하지 않습니다. 라코 디스
위의 코드는 해당 클래스가 Comparable을 구현하지 않더라도 모든 클래스의 모든 인스턴스에 전체 순서를 적용합니까?
해결책
이봐, 내가 뭘 찾았는지 봐!
http://gafter.blogspot.com/2007/03/compact-object-comparator.html
예, IdentityHashMap (Java 6 이상 만 해당)을 잊어 버렸습니다.비교기를 해제 할 때주의를 기울여야합니다.
다른 팁
댓글에 답변하셨습니다 : <인용구>
는 false를 반환하지만 ID 해시 코드는 동일합니다. o1== o2라고 가정합니다.
안타깝게도 그렇게 가정 할 수 없습니다.대부분의 경우 작동하지만 일부 예외적 인 경우에는 작동하지 않습니다.그리고 당신은 언제 알 수 없습니다.이러한 경우가 나타나면 예를 들어 TreeSet에서 인스턴스를 잃게됩니다.
이 조항이 충족되지 않았기 때문에 그렇지 않다고 생각합니다 : <인용구>
마지막으로 구현자는 x.compareTo (y)== 0이 모든 z에 대해 sgn (x.compareTo (z))== sgn (y.compareTo (z))를 의미하는지 확인해야합니다.
equal (o1, o2)는 o1의 equals 구현에 의존하기 때문에 논리적으로 동일한 (같음에 의해 결정된) 두 객체는 여전히 두 개의 다른 identityHashCode를가집니다.
따라서 세 번째 개체 (z)와 비교할 때 compareTo에 대해 다른 값이 생성 될 수 있습니다.
말이 되나요?
해시 충돌이 발생했을 때 마지막 return 0
줄에 도달하면 예외를 발생시켜야합니다.그래도 질문이 있습니다. 해시에 대해 전체 순서를 지정하고 있습니다. 괜찮지 만 사전 순서를 정의하기 위해 일부 함수를 전달해서는 안 되나요?
라코 디스
실수를 형성하는 두 정수의 튜플로 객체를 가지고 있다고 상상할 수 있습니다.그러나 객체의 해시 만 취하기 때문에 올바른 순서를 얻지 못할 것입니다.해싱이 당신이 의미하는 바라면 이것은 모두 당신에게 달려 있지만, 나에게는 의미가 없습니다.
나는 이것이 이상적이지 않다는 데 동의합니다.제안이 있으십니까?
이제 문제를 해결할 수있는 방법이 있다고 생각합니다. 두 인스턴스를 구별 할 수있는 단 한 가지, 즉 메모리의 주소에 액세스 할 수 없기 때문입니다.그래서 저는 단 하나의 제안이 있습니다. 자바에서 일반적인 총 주문 프로세스가 필요하다는 것을 재고하십시오 :-)
System.identityHashCode(Object)
에 대해 잘 모르겠습니다.이것이 == 가 사용되는 용도입니다.Object.hashCode()
를 사용하고 싶을 수도 있습니다. Object.equals(Object)
와 더 병행합니다.