قائمة بتحويل Treeset تنتج:
-
22-09-2019 - |
سؤال
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
البناء.