Java에서 * 모든 * 클래스의 모든 인스턴스에 대해 전체 순서 지정

StackOverflow https://stackoverflow.com/questions/28301

  •  09-06-2019
  •  | 
  •  

문제

다음 코드가 Comparator의 Javadoc에 제공된 모든 조건을 보장하는지 확실하지 않습니다. 라코 디스

위의 코드는 해당 클래스가 Comparable을 구현하지 않더라도 모든 클래스의 모든 인스턴스에 전체 순서를 적용합니까?

도움이 되었습니까?

해결책

<인용구>

이봐, 내가 뭘 찾았는지 봐!

http://gafter.blogspot.com/2007/03/compact-object-comparator.html

예, IdentityHashMap (Java 6 이상 만 해당)을 잊어 버렸습니다.비교기를 해제 할 때주의를 기울여야합니다.

다른 팁

이봐, 내가 뭘 찾았는지 봐!

http://gafter.blogspot.com/2007/03/compact-object-comparator.html

정확히 제가 찾던 것입니다.

댓글에 답변하셨습니다 : <인용구>

는 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)와 더 병행합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top