مثال على TreeSet مع قابلة للمقارنة في Java
يوضح المثال الأول أدناه خطأ حدث عند إضافة كائن إلى قائمة من النوع Set. في المجموعة ، يجب أن يكون كل عنصر فريدا ، ولهذا السبب يجب أن يكون الكائن مقارنة بالكائنات الموجودة في TreeSet قبل إدراجها.أولا ، دعنا نلقي نظرة على الكود التالي الذي ينشئ ثلاثة كائنات "نقطة" ويضيفها إلى TreeSet.
import java.util.TreeSet;والسبب هو أن فئة Point تحتاج إلى تنفيذ الواجهة قابل للمقارنةامتداد> للسماح ل TreeSet بالاحتفاظ بكائنات النقطة. لا يمكن مقارنة الكائن المضاف بالعناصر الموجودة في TreeSet ، الطريقة add () < / span> يطرح استثناء كلاس كاستيكسسيبسيبشنسبان>. لجعل كائن قابل للمقارنة ، تحتاج إلى تنفيذ واجهة Comparable.
class Point {
int x,y;
النقطة العامة (int x, int y){
this.x = x;
this.y = y;
}
}
الطبقة العامة ImpComparableWrong {
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
TreeSetd = TreeSet () الجديدة ؛
d.add (النقطة الجديدة (2،4)) ؛
d.add (نقطة جديدة (1،7)) ؛
d.add (نقطة جديدة (5،3)) ؛
System.out.println(d.size());
}
}
< / dot >< / dot >< / pre> يرجع التجميع والتنفيذ هذه النتيجة:
< pre class = "prettyprint lang-java" > استثناء في مؤشر الترابط java.lang.ClassCastException : لا يمكن إرسال TreeSet.Point إلى java.lang.Comparable
في java.util.TreeMap.compare (مصدر غير معروف)
في java.util.TreeMap.put (مصدر غير معروف)
في java.util.TreeSet.add (مصدر غير معروف)
at TreeSet.Comparable.main(Comparable.java:17)
تقوم التعليمة البرمجية التالية بتصحيح هذا الخطأ من خلال تنفيذ الواجهة قابلة للمقارنة:
< pre class = "prettyprint lang-java" >import java.util.Iterator ؛
import java.util.TreeSet;
class Point تنفذ قابلة للمقارنة<نقطة>{
int x,y;
النقطة العامة (int x, int y){
this.x = x;
this.y = y;
}
int العامة compareTo (النقطة p) {
مزدوج dp2 = (مزدوج) Math.sqrt (Math.pow (p.x، 2) + Math.pow (p.y، 2)) ؛
dp مزدوج = (مزدوج) Math.sqrt (Math.pow (x ، 2) + Math.pow (y ، 2)) ؛
إذا (dp > dp2)
إرجاع 1 ؛
else
إرجاع 0 ؛
}
}
Public Class Comparabletest {
الفراغ العام الثابت الرئيسي (سلسلة [] args) {
TreeSet
tset.add (نقطة جديدة (2،4)) ؛
tset.add (نقطة جديدة (1،7)) ؛
النقطة أ = نقطة جديدة (2,5) ؛
مكرر<نقطة> مكرر = tset.iterator ();
while(iterator.hasNext()){
Point p = iterator.next();
System.out.print (p.x +" ، "+ p.y); < br / > System.out.println (" | ص > أ: "+p.compareTo(a))؛
}
}
}
< / dot >< / dot >< / dot >< / dot >< / pre> ينتج هذا البرنامج هذه النتيجة:
< pre class = "prettyprint lang-java" > 2 ، 4 | ص > ج: 0
1 ، 7 | ص > ج: 1
< / pre> المراجع:
Javadoc: فئة TreeSet < / أ>