تطبق فئة Java TreeSet واجهة Set التي تستخدم شجرة للتخزين. إنه يرث فئة AbstractSet وينفذ واجهة NavigableSet. يتم تخزين كائنات فئة TreeSet بترتيب تصاعدي.
النقاط المهمة حول فئة Java TreeSet هي:
- تحتوي فئة Java TreeSet على عناصر فريدة فقط مثل HashSet.
- تكون أوقات الوصول إلى فئة Java TreeSet واسترجاعها سريعة جدًا.
- لا تسمح فئة Java TreeSet بالعنصر الفارغ.
- فئة Java TreeSet غير متزامنة.
- تحافظ فئة Java TreeSet على ترتيب تصاعدي.
- تحتوي فئة Java TreeSet على عناصر فريدة فقط مثل HashSet.
- أوقات الوصول إلى فئة Java TreeSet واسترجاعها سريعة جدًا.
- لا تسمح فئة Java TreeSet بالعناصر الفارغة.
- فئة Java TreeSet غير متزامنة.
- تحافظ فئة Java TreeSet على ترتيب تصاعدي.
- يمكن لـ TreeSet السماح فقط لتلك الأنواع العامة القابلة للمقارنة. على سبيل المثال، يتم تنفيذ الواجهة القابلة للمقارنة بواسطة فئة StringBuffer.
العمل الداخلي لفئة TreeSet
يتم تنفيذ TreeSet باستخدام شجرة بحث ثنائية، وهي ذات توازن ذاتي تمامًا مثل الشجرة ذات اللون الأحمر والأسود. لذلك، فإن العمليات مثل البحث والإزالة والإضافة تستهلك وقتًا O(log(N))). السبب وراء ذلك موجود في شجرة التوازن الذاتي. إنه موجود للتأكد من أن ارتفاع الشجرة لا يتجاوز أبدًا O(log(N)) لجميع العمليات المذكورة. ولذلك فهي إحدى هياكل البيانات الفعالة من أجل الحفاظ على البيانات الكبيرة التي يتم فرزها والقيام بالعمليات عليها أيضًا.
مزامنة فئة TreeSet
كما سبق ذكره أعلاه، لا تتم مزامنة فئة TreeSet. وهذا يعني أنه إذا وصل أكثر من مؤشر ترابط واحد بشكل متزامن إلى مجموعة شجرة، وقام أحد سلاسل الوصول بتعديلها، فيجب إجراء المزامنة يدويًا. يتم ذلك عادةً عن طريق إجراء بعض مزامنة الكائنات التي تغلف المجموعة. ومع ذلك، في حالة عدم العثور على مثل هذا الكائن، فيجب تغليف المجموعة بمساعدة أسلوب Collections.synchronizedSet(). يُنصح باستخدام هذه الطريقة أثناء وقت الإنشاء لتجنب الوصول غير المتزامن إلى المجموعة. يظهر مقتطف الكود التالي نفس الشيء.
TreeSet treeSet = new TreeSet(); Set syncrSet = Collections.synchronziedSet(treeSet);
التسلسل الهرمي لفئة TreeSet
كما هو موضح في الرسم البياني أعلاه، تقوم فئة Java TreeSet بتنفيذ واجهة NavigableSet. تعمل واجهة NavigableSet على توسيع واجهات SortedSet وSet وCollection وIterable بترتيب هرمي.
الرياضيات جافا sqrt
إعلان فئة TreeSet
دعونا نرى إعلان فئة java.util.TreeSet.
es5 مقابل es6
public class TreeSet extends AbstractSet implements NavigableSet, Cloneable, Serializable
منشئو فئة Java TreeSet
البناء | وصف |
---|---|
مجموعة الشجرة() | يتم استخدامه لإنشاء مجموعة شجرية فارغة سيتم فرزها بترتيب تصاعدي وفقًا للترتيب الطبيعي لمجموعة الأشجار. |
TreeSet(المجموعة ج) | يتم استخدامه لبناء مجموعة شجرة جديدة تحتوي على عناصر المجموعة ج. |
TreeSet(المقارنة المقارنة) | يتم استخدامه لإنشاء مجموعة شجرية فارغة سيتم فرزها وفقًا للمقارنة المحددة. |
TreeSet(SortedSet s) | يتم استخدامه لإنشاء TreeSet الذي يحتوي على عناصر SortedSet المحددة. |
طرق فئة Java TreeSet
طريقة | وصف |
---|---|
إضافة منطقية (E e) | يتم استخدامه لإضافة العنصر المحدد إلى هذه المجموعة إذا لم يكن موجودًا بالفعل. |
إضافة منطقية (المجموعة ج) | يتم استخدامه لإضافة كافة العناصر الموجودة في المجموعة المحددة إلى هذه المجموعة. |
السقف الإلكتروني (E e) | تقوم بإرجاع العنصر الأكبر المساوٍ أو الأقرب للعنصر المحدد من المجموعة، أو لا يوجد مثل هذا العنصر. |
المقارنة المقارنة() | تقوم بإرجاع المقارنة التي ترتب العناصر بالترتيب. |
مكرر تنازلي مكرر () | يتم استخدامه لتكرار العناصر بترتيب تنازلي. |
NavigableSet تنازلي () | تقوم بإرجاع العناصر بترتيب عكسي. |
الطابق E(E e) | تقوم بإرجاع العنصر الأصغر المساوٍ أو الأقرب للعنصر المحدد من المجموعة، أو لا يوجد مثل هذا العنصر. |
مجموعة رأس SortedSet (E toElement) | تقوم بإرجاع مجموعة العناصر التي تكون أقل من العنصر المحدد. |
NavigableSet headSet(E toElement، منطقية شاملة) | تقوم بإرجاع مجموعة العناصر التي تكون أقل من أو تساوي (إذا كان الشمول صحيحًا) العنصر المحدد. |
ه أعلى(ه ه) | تقوم بإرجاع أقرب عنصر أعظم للعنصر المحدد من المجموعة، أو لا يوجد مثل هذا العنصر. |
مكرر مكرر () | يتم استخدامه لتكرار العناصر بترتيب تصاعدي. |
ه أقل(ه ه) | تقوم بإرجاع أقرب عنصر أصغر للعنصر المحدد من المجموعة، أو لا يوجد مثل هذا العنصر. |
الاستطلاع الإلكتروني أولاً () | يتم استخدامه لاسترداد وإزالة العنصر الأدنى (الأول). |
الاستطلاع الإلكترونيالأخير() | يتم استخدامه لاسترداد وإزالة العنصر الأعلى (الأخير). |
مقسم () | يتم استخدامه لإنشاء أداة تقسيم متأخرة وسريعة الفشل على العناصر. |
مجموعة NavigableSet الفرعية (E fromElement، منطقية fromInclusive، E toElement، منطقية toInclusive) | تقوم بإرجاع مجموعة من العناصر التي تقع بين النطاق المحدد. |
SortedSet subSet(E fromElement, E toElement)) | تقوم بإرجاع مجموعة من العناصر التي تقع بين النطاق المحدد الذي يتضمن fromElement ويستثني toElement. |
SortedSet tailSet(E fromElement) | تقوم بإرجاع مجموعة من العناصر أكبر من أو تساوي العنصر المحدد. |
NavigableSet tailSet(E fromElement، منطقية شاملة) | تقوم بإرجاع مجموعة من العناصر التي تكون أكبر من أو تساوي (إذا كان الشمول صحيحًا) العنصر المحدد. |
منطقي يحتوي على (كائن س) | يتم إرجاعه صحيحًا إذا كانت هذه المجموعة تحتوي على العنصر المحدد. |
منطقي فارغ () | يتم إرجاعه صحيحًا إذا كانت هذه المجموعة لا تحتوي على عناصر. |
إزالة منطقية (الكائن س) | يتم استخدامه لإزالة العنصر المحدد من هذه المجموعة إذا كان موجودًا. |
باطل واضح () | يتم استخدامه لإزالة كافة العناصر من هذه المجموعة. |
استنساخ الكائن () | تقوم بإرجاع نسخة سطحية من مثيل TreeSet هذا. |
ه أولا () | تقوم بإرجاع العنصر الأول (الأدنى) الموجود حاليًا في هذه المجموعة التي تم فرزها. |
ه الأخير () | تقوم بإرجاع العنصر الأخير (الأعلى) الموجود حاليًا في هذه المجموعة التي تم فرزها. |
حجم صحيح () | تقوم بإرجاع عدد العناصر في هذه المجموعة. |
أمثلة على مجموعة شجرة جافا
مثال Java TreeSet 1:
دعونا نرى مثالاً بسيطًا على Java TreeSet.
اسم الملف: TreeSet1.java
import java.util.*; class TreeSet1{ public static void main(String args[]){ //Creating and adding elements TreeSet al=new TreeSet(); al.add('Ravi'); al.add('Vijay'); al.add('Ravi'); al.add('Ajay'); //Traversing elements Iterator itr=al.iterator(); while(itr.hasNext()){ System.out.println(itr.next()); } } }اختبره الآن
انتاج:
Ajay Ravi Vijay
مثال Java TreeSet 2:
دعونا نرى مثالاً على عبور العناصر بترتيب تنازلي.
اسم الملف: TreeSet2.java
import java.util.*; class TreeSet2{ public static void main(String args[]){ TreeSet set=new TreeSet(); set.add('Ravi'); set.add('Vijay'); set.add('Ajay'); System.out.println('Traversing element through Iterator in descending order'); Iterator i=set.descendingIterator(); while(i.hasNext()) { System.out.println(i.next()); } } }اختبره الآن
انتاج:
Traversing element through Iterator in descending order Vijay Ravi Ajay Traversing element through NavigableSet in descending order Vijay Ravi Ajay
مثال Java TreeSet 3:
دعونا نرى مثالاً لاسترداد وإزالة القيمة الأعلى والأدنى.
اسم الملف: TreeSet3.java
مزايا وعيوب التكنولوجيا
import java.util.*; class TreeSet3{ public static void main(String args[]){ TreeSet set=new TreeSet(); set.add(24); set.add(66); set.add(12); set.add(15); System.out.println('Lowest Value: '+set.pollFirst()); System.out.println('Highest Value: '+set.pollLast()); } }
انتاج:
Lowest Value: 12 Highest Value: 66
مثال Java TreeSet 4:
في هذا المثال، نقوم بتنفيذ عمليات NavigableSet المختلفة.
اسم الملف: TreeSet4.java
ترينج إلى كثافة العمليات
import java.util.*; class TreeSet4{ public static void main(String args[]){ TreeSet set=new TreeSet(); set.add('A'); set.add('B'); set.add('C'); set.add('D'); set.add('E'); System.out.println('Initial Set: '+set); System.out.println('Reverse Set: '+set.descendingSet()); System.out.println('Head Set: '+set.headSet('C', true)); System.out.println('SubSet: '+set.subSet('A', false, 'E', true)); System.out.println('TailSet: '+set.tailSet('C', false)); } }
انتاج:
Initial Set: [A, B, C, D, E] Reverse Set: [E, D, C, B, A] Head Set: [A, B, C] SubSet: [B, C, D, E] TailSet: [D, E]
مثال Java TreeSet 5:
في هذا المثال، نقوم بتنفيذ عمليات SortedSetSet المختلفة.
اسم الملف: TreeSet5.java
import java.util.*; class TreeSet5{ public static void main(String args[]){ TreeSet set=new TreeSet(); set.add('A'); set.add('B'); set.add('C'); set.add('D'); set.add('E'); System.out.println('Intial Set: '+set); System.out.println('Head Set: '+set.headSet('C')); System.out.println('SubSet: '+set.subSet('A', 'E')); System.out.println('TailSet: '+set.tailSet('C')); } }
انتاج:
Intial Set: [A, B, C, D, E] Head Set: [A, B] SubSet: [A, B, C, D] TailSet: [C, D, E]
مثال Java TreeSet: Book
دعونا نرى مثالاً على TreeSet حيث نقوم بإضافة كتب إلى المجموعة وطباعة جميع الكتب. يجب أن تكون العناصر الموجودة في TreeSet من النوع القابل للمقارنة. فئات السلسلة والمغلف قابلة للمقارنة بشكل افتراضي. لإضافة كائنات معرفة من قبل المستخدم في TreeSet، تحتاج إلى تنفيذ الواجهة القابلة للمقارنة.
اسم الملف: TreeSetExample.java
import java.util.*; class Book implements Comparable{ int id; String name,author,publisher; int quantity; public Book(int id, String name, String author, String publisher, int quantity) { this.id = id; this.name = name; this.author = author; this.publisher = publisher; this.quantity = quantity; } // implementing the abstract method public int compareTo(Book b) { if(id>b.id){ return 1; }else if(id <b.id){ return -1; }else{ 0; } public class treesetexample { static void main(string[] args) set treeset(); creating books book b1="new" book(121,'let us c','yashwant kanetkar','bpb',8); b2="new" book(233,'operating system','galvin','wiley',6); b3="new" book(101,'data communications & networking','forouzan','mc graw hill',4); adding to treeset set.add(b1); set.add(b2); set.add(b3); traversing for(book b:set){ system.out.println(b.id+' '+b.name+' '+b.author+' '+b.publisher+' '+b.quantity); < pre> <p> <strong>Output:</strong> </p> <pre>101 Data Communications & Networking Forouzan Mc Graw Hill 4 121 Let us C Yashwant Kanetkar BPB 8 233 Operating System Galvin Wiley 6 </pre> <h3>ClassCast Exception in TreeSet</h3> <p>If we add an object of the class that is not implementing the Comparable interface, the ClassCast Exception is raised. Observe the following program.</p> <p> <strong>FileName:</strong> ClassCastExceptionTreeSet.java</p> <pre> // important import statement import java.util.*; class Employee { int empId; String name; // getting the name of the employee String getName() { return this.name; } // setting the name of the employee void setName(String name) { this.name = name; } // setting the employee id // of the employee void setId(int a) { this.empId = a; } // retrieving the employee id of // the employee int getId() { return this.empId; } } public class ClassCastExceptionTreeSet { // main method public static void main(String[] argvs) { // creating objects of the class Employee Employee obj1 = new Employee(); Employee obj2 = new Employee(); TreeSet ts = new TreeSet(); // adding the employee objects to // the TreeSet class ts.add(obj1); ts.add(obj2); System.out.println('The program has been executed successfully.'); } } </pre> <p>When we compile the above program, we get the ClassCastException, as shown below.</p> <pre> Exception in thread 'main' java.lang.ClassCastException: class Employee cannot be cast to class java.lang.Comparable (Employee is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap') at java.base/java.util.TreeMap.compare(TreeMap.java:1569) at java.base/java.util.TreeMap.addEntryToEmptyMap(TreeMap.java:776) at java.base/java.util.TreeMap.put(TreeMap.java:785) at java.base/java.util.TreeMap.put(TreeMap.java:534) at java.base/java.util.TreeSet.add(TreeSet.java:255) at ClassCastExceptionTreeSet.main(ClassCastExceptionTreeSet.java:52) </pre> <p> <strong>Explanation:</strong> In the above program, it is required to implement a Comparable interface. It is because the TreeSet maintains the sorting order, and for doing the sorting the comparison of different objects that are being inserted in the TreeSet is must, which is accomplished by implementing the Comparable interface.</p> <hr></b.id){>
استثناء ClassCast في TreeSet
إذا أضفنا كائنًا من الفئة التي لا تقوم بتطبيق الواجهة القابلة للمقارنة، فسيظهر استثناء ClassCast. لاحظ البرنامج التالي
سلسلة جافا متسلسلة
اسم الملف: ClassCastExceptionTreeSet.java
// important import statement import java.util.*; class Employee { int empId; String name; // getting the name of the employee String getName() { return this.name; } // setting the name of the employee void setName(String name) { this.name = name; } // setting the employee id // of the employee void setId(int a) { this.empId = a; } // retrieving the employee id of // the employee int getId() { return this.empId; } } public class ClassCastExceptionTreeSet { // main method public static void main(String[] argvs) { // creating objects of the class Employee Employee obj1 = new Employee(); Employee obj2 = new Employee(); TreeSet ts = new TreeSet(); // adding the employee objects to // the TreeSet class ts.add(obj1); ts.add(obj2); System.out.println('The program has been executed successfully.'); } }
عندما نقوم بتجميع البرنامج أعلاه، نحصل على ClassCastException، كما هو موضح أدناه.
Exception in thread 'main' java.lang.ClassCastException: class Employee cannot be cast to class java.lang.Comparable (Employee is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap') at java.base/java.util.TreeMap.compare(TreeMap.java:1569) at java.base/java.util.TreeMap.addEntryToEmptyMap(TreeMap.java:776) at java.base/java.util.TreeMap.put(TreeMap.java:785) at java.base/java.util.TreeMap.put(TreeMap.java:534) at java.base/java.util.TreeSet.add(TreeSet.java:255) at ClassCastExceptionTreeSet.main(ClassCastExceptionTreeSet.java:52)
توضيح: في البرنامج أعلاه، مطلوب تنفيذ واجهة قابلة للمقارنة. وذلك لأن TreeSet يحافظ على ترتيب الفرز، وللقيام بالفرز، يجب مقارنة الكائنات المختلفة التي يتم إدراجها في TreeSet، وهو ما يتم تحقيقه من خلال تطبيق الواجهة القابلة للمقارنة.