سؤال

List<MyClass> myclassList = (List<MyClass>) rs.get();

TreeSet<MyClass> myclassSet = new TreeSet<MyClass>(myclassList);

لا أفهم لماذا يولد هذا الرمز هذا:

java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable

MyClass لا تنفذ قابلة للمقارنة. أريد فقط استخدام مجموعة لتصفية العناصر الفريدة من القائمة لأن قائمتي تحتوي على التكرارات غير الضرورية.

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

المحلول

يفعل MyClass implements Comparable<MyClass> أو أي شيء من هذا القبيل؟

إذا لم يكن كذلك ، فلهذا السبب.

ل TreeSet, ، إما عليك صنع العناصر Comparable, ، أو تقديم أ Comparator. غير ذلك TreeSet لا يمكن أن تعمل لأنه لن يعرف كيفية طلب العناصر.

يتذكر، TreeMap implements SortedSet, ، لذلك يجب أن تعرف كيفية طلب العناصر بطريقة أو بأخرى.

يجب أن تتعرف على كيفية التنفيذ Comparableتعريف الترتيب الطبيعي للكائنات من نوع معين.

تحدد الواجهة طريقة واحدة ، compareTo, ، يجب أن يعيد ذلك عددًا صحيحًا سلبيًا أو صفرًا أو عدد صحيح إيجابي إذا كان هذا الكائن أقل من أو أكبر أو أكبر من الكائن الآخر على التوالي.

العقد يستوجب الذي - التي:

  • sgn(x.compareTo(y)) == -sgn(y.compareTo(x))
  • إنه متعدي: x.compareTo(y)>0 && y.compareTo(z)>0 يدل x.compareTo(z)>0
  • x.compareTo(y)==0 يعني ذلك sgn(x.compareTo(z)) == sgn(y.compareTo(z)) للجميع z

بالإضافة إلى ذلك ، هو يوصي الذي - التي:

  • (x.compareTo(y)==0) == (x.equals(y)), ، أي بما يتوافق مع equals

قد يبدو هذا الأمر كثيرًا للهضم في البداية ، ولكن من الطبيعي حقًا كيف يحدد المرء الترتيب الكلي.


إذا كان لا يمكن طلب كائناتك بطريقة أو بأخرى ، فعندئذ أ TreeSet لن يكون له معنى. قد ترغب في استخدام أ HashSet بدلا من ذلك ، التي لها عقود خاصة بها. من المحتمل أن تكون مطالبة @Override hashCode() و equals(Object) حسب الاقتضاء لنوعك (انظر: التجويد المتساوي و hashcode في جافا)

نصائح أخرى

إذا لم تمر صريحًا Comparator إلى TreeSet, ، سيحاول مقارنة الكائنات (من خلال افتراض أنها كذلك Comparable). وإذا لم يفعلوا ذلك Comparable, ، لا يمكن مقارنتها ، لذلك يتم إلقاء هذا الاستثناء!
TreeSets هي مجموعات مصنفة وتتطلب أن تكون الكائنات Comparable أو أ Comparator ليتم تمريرها لتحديد كيفية فرز الكائنات في Set.

إذا كنت تريد فقط أن تزيل المجموعة التكرارات ، فاستخدم أ HashSet, ، على الرغم من أن هذا سيخلف ترتيب الكائنات التي يتم إرجاعها بواسطة Iterator بطرق تبدو عشوائية.
ولكن إذا كنت تريد الحفاظ على الطلب إلى حد ما ، فاستخدم LinkedHashSet, ، سيحافظ ذلك على الأقل على ترتيب الإدراج في القائمة.

TreeSet مناسب فقط إذا كنت بحاجة إلى Set فرز ، إما عن طريق تنفيذ الكائن Comparable أو عن طريق العرف Comparator انتقل إلى TreeSet's البناء.

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