لماذا لا يعمل صفي بشكل صحيح في حشيش جافا؟
-
11-09-2019 - |
سؤال
أنا أعمل في مشروع ينطوي علي باستخدام 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 # # # () هوية مثيل الكائنات (معرف المرجع). يرى هنا للحصول على برنامج تعليمي حول هذا الموضوع.