HashSet مشكلة يساوي hashCode مع على العمل بشكل مختلف مما كنت تتوقع

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

سؤال

لدي البرمجية التالية:

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 الآن مع HashSet:1 1 0

ومع ذلك ، سوف يكون من المتوقع السطر الأخير أن يكون صحيحا (1) كذلك.هل هناك شيء واضح أن أنا في عداد المفقودين.

(نعم, وأنا أعلم أن بلدي يساوي طريقة hashcode لا تأخذ بعض القضايا بعين الاعتبار...فهي تعمد بسيطة ، ولكن اسمحوا لي أن أعرف إذا كان هناك قضايا تسبب هذه المشكلة)

هل كانت مفيدة؟

المحلول

ويجب عدم تنفيذ جافا نمط يساوي وطريقة شفرة التجزئة، ولكن بدلا من ذلك بيثون equivaltents __eq__ و__hash__. مضيفا

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

ويساعد. هذه الأساليب هي الثعبان - بقدر ما أعرف - ملزمة حيوي لشفرة التجزئة ومتساوين () من خلال جايثون. وهذا ما يضمن أنه يمكنك وضع الطبقات بيثون في مجموعات جاوة.

والآن رمز طباعة خمسة "1".

نصائح أخرى

كتبت ما يعادل البرمجية في جافا وأنه لا تنتج ينطبق على كل ثلاثة يحتوي على() المكالمات.لذلك أنا أعتقد أن هذا يجب أن يكون غرائب في Jython.ربما الكامنة كائنات جافا ليست بالضبط ما كنت انظر إليهم في بيثون.

أنا لا أعرف بيثون ، ولكن يبدو الأساسية جافا الكائن يساوي() و hashcode() ليست تكريم العقد اللازم.

  • اثنين من الأشياء إذا كان يساوي() يجب أن يعود نفس hashcode().

يبدو أن ينتهك.HashSets لأول مرة الذهاب إلى استخدام hashcode في البحث للحصول على قائمة مطابقة كائن أن يكون ، ثم انتقل من خلال قائمة للعثور على واحد الذي هو على قدم المساواة.إذا كان الخاص بك hashcode ليس تكريم العقد و هم يعودون مختلفة hashcodes فلن تجد في hashset حتى لو كانوا يساوي() للمقارنة.

الافتراضي كائن جافا.hashcode() لن يعود نفس hashcode 2 الكائنات.عليك تجاوز ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top