문제

다음 코드가 있습니다.

class IncidentTag:
     def __init__(self,tag):
        self.tag = tag
     def equals(self,obj):
        return self.tag.equals(obj.tag)
     def hashCode(self):
        return self.tag.hashCode()

from java.lang import String
from java.util import HashMap
from java.util import HashSet

tag1 = IncidentTag(String("email"))
tag1copy = IncidentTag(String("email"))
tag2 = IncidentTag(String("notemail"))

print tag1.equals(tag1copy)
print tag2.equals(tag2)

print "Now with HashSet:"

hSet = HashSet()
hSet.add(tag1)
hSet.add(tag2)

print hSet.contains(tag1)
print hSet.contains(tag2)
print hSet.contains(tag1copy)

출력은 : 1 1 지금 해시 세트와 함께 : 1 1 0

그러나 나는 마지막 줄이 사실이 될 것으로 예상했을 것이다 (1). 내가 놓친 것이 분명합니까?

(예, 내 평등 방법과 해시 코드 방법이 일부 문제를 고려하지 않는다는 것을 알고 있습니다 ... 고의적으로 간단하지만 문제가 발생하는 문제 가이 문제를 일으키는 지 알려주세요)

도움이 되었습니까?

해결책

Java 스타일 평등 및 해시 코드 방법을 구현해서는 안되지만 Python 등가물 __eq__ 그리고 __hash__. 첨가

def __hash__(self):
    return self.hashCode()
def __eq__(self, o):
    return self.equals(o)

도움이됩니다. 이 파이썬 방법은 내가 아는 한, Jython의 Hashcode 및 Equals ()에 동적으로 바인딩됩니다. 이를 통해 Python 클래스를 Java의 컬렉션에 넣을 수 있습니다.

이제 코드는 5 "1"을 인쇄합니다.

다른 팁

Java로 동등한 코드를 작성했으며 세 개의 포함 () 호출에 대해 True를 생성합니다. 그래서 나는 이것이 Jython에서 이상하다고 생각합니다. 어쩌면 근본적인 Java 객체는 Python에서와 같이 정확히 보는 것이 아닐 수도 있습니다.

나는 파이썬을 모르지만, 기본 Java Object 's Equals ()와 Hashcode ()가 필요한 계약을 존중하지 않는 것처럼 보입니다.

  • equals ()가 동일한 hashcode ()를 반환 해야하는 경우 두 객체.

위반 된 것 같습니다. 해시 세트는 먼저 조회에서 해시 코드를 사용하여 일치하는 객체가있는 목록을 얻은 다음 목록을 통해 동등한 것을 찾으십시오. 해시 코드가 계약을 존중하지 않고 다른 해시 코드를 반환하는 경우 () 비슷한 경우에도 해시 세트에서 찾을 수 없습니다.

기본 java object.hashcode ()는 2 개의 객체에 대해 동일한 해시 코드를 반환하지 않을 것입니다. 당신은 그것을 무시해야합니다.

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