سؤال

أنا أعمل في مشروع ينطوي علي باستخدام HashSet من فئة صنعت، والتي سوف اسم Test. وبعد حددت المذكورة HashSet مثل ذلك:

HashSet<Test> t = new HashSet<Test>();
t.add(new Test("asdf", 1));
t.add(new Test("hello", 2));
t.add(new Test("hello", 3));

حاولت استخدام

t.contains(new Test("asdf", 1));

لكنه يعود false. وبعد ومع ذلك، عندما أستخدم HashSet<Character> ويبدو أن تعمل بشكل جيد. حاولت تجاوز السابق equals الإعلان، لكنه لم ينجح. حاولت مغادرة equals وحده، لكن لا يزال لدي false. وبعد أحتاج إلى معرفة ما أفعله خطأ؟

أيضا، لم أحصل على وظيفة التجزئة، لقد غيرت فقط Test.Aquals (كائن O). إنه مشروع بسيط وبينما ينص وثائق جافا على أنه يستخدم O.Aquals (هذا)، اعتقدت أنني لن تضطر إلى ذلك.

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

المحلول

قد تضطر إلى تحميل طريقة Hashcode () أيضا.

نصائح أخرى

HashSet.add(Object data) لا يساوي HashSet.add(new Test(String, int))

حاول استخدام HashSet.add(new Test("asdf", 1));. وبعد وجعل التجاوزات من hashCode() طريقة. هل تجميع التعليمات البرمجية الخاصة بك؟

الكود الخاص بك لن يجمع حتى ...

لا يحتوي Hashset على طريقة إضافة () تقبل حجتين.

اذا كنت تقصد

t.add(new Test("asdf", 1));

بدلا من

t.add("asdf", 1);

تأكد من تنفيذ طريقة Hashcode و Aquals من فئة الاختبار بشكل صحيح، كما قال من قبل.

سيستخدم Ishtable داخليا للكائن # Hashcode # ()، إلى التجزئة وإدارة الكائنات الخاصة بك، والكائن # يساوي () لاختبار المساواة إذا كان هناك اشتباكات Hashcode. تحتاج إلى التأكد من أن فئة الاختبار توفر تطبيقات مناسبة (Overrides) هذه، في حالتك لاختبار المساواة السلسلة، وإلا فإن الطريقة ستستخدم طريقة Equals # # # () هوية مثيل الكائنات (معرف المرجع). يرى هنا للحصول على برنامج تعليمي حول هذا الموضوع.

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