מחלקת Java TreeSet מיישמת את ממשק ה-Set שמשתמש בעץ לאחסון. הוא יורש את מחלקה AbstractSet ומיישם את ממשק NavigableSet. האובייקטים של המחלקה TreeSet מאוחסנים בסדר עולה.
הנקודות החשובות לגבי מחלקת Java TreeSet הן:
- מחלקה Java TreeSet מכילה אלמנטים ייחודיים רק כמו HashSet.
- זמני הגישה והשליפה של Java TreeSet הם שקטים ומהירים.
- מחלקת Java TreeSet אינה מאפשרת רכיב null.
- מחלקת Java TreeSet אינה מסונכרנת.
- מחלקה Java TreeSet שומרת על סדר עולה.
- מחלקה Java TreeSet מכילה אלמנטים ייחודיים רק כמו HashSet.
- זמני הגישה והשליפה של Java TreeSet הם די מהירים.
- מחלקת Java TreeSet אינה מאפשרת רכיבי null.
- מחלקת Java TreeSet אינה מסונכרנת.
- מחלקה Java TreeSet שומרת על סדר עולה.
- ה-TreeSet יכול לאפשר רק את אותם סוגים גנריים שהם ברי השוואה. לדוגמה, ממשק Comparable מיושם על ידי המחלקה StringBuffer.
עבודה פנימית של The TreeSet Class
TreeSet מיושם באמצעות עץ חיפוש בינארי, המאזן את עצמו בדיוק כמו עץ אדום-שחור. לכן, פעולות כגון חיפוש, הסרה והוספה צורכות זמן O(log(N)). הסיבה מאחורי זה נמצאת בעץ האיזון העצמי. זה שם כדי להבטיח שגובה העץ לעולם לא יעלה על O(log(N)) עבור כל הפעולות שהוזכרו. לכן, זה אחד ממבני הנתונים היעילים על מנת לשמור על הנתונים הגדולים שממוינים וגם לעשות עליו פעולות.
סנכרון של The TreeSet Class
כפי שכבר צוין לעיל, המחלקה TreeSet אינה מסונכרנת. זה אומר שאם יותר משרשור אחד ניגש בו-זמנית לקבוצת עץ, ואחד משרשורי הגישה משנה אותו, אז הסנכרון חייב להתבצע באופן ידני. זה נעשה בדרך כלל על ידי ביצוע סנכרון אובייקטים שכולל את הסט. עם זאת, במקרה בו לא נמצא אובייקט כזה, יש לעטוף את הסט בעזרת השיטה Collections.synchronizedSet() . מומלץ להשתמש בשיטה בזמן היצירה על מנת להימנע מגישה לא מסונכרנת של הסט. קטע הקוד הבא מציג את אותו הדבר.
TreeSet treeSet = new TreeSet(); Set syncrSet = Collections.synchronziedSet(treeSet);
היררכיה של מחלקה TreeSet
כפי שמוצג בתרשים לעיל, מחלקת Java TreeSet מיישמת את ממשק NavigableSet. ממשק NavigableSet מרחיב את ממשקי SortedSet, Set, Collection ו-Iterable בסדר היררכי.
supw
הצהרת מחלקת TreeSet
בוא נראה את ההצהרה עבור המחלקה java.util.TreeSet.
public class TreeSet extends AbstractSet implements NavigableSet, Cloneable, Serializable
בונים של Java TreeSet Class
בַּנַאִי | תיאור |
---|---|
TreeSet() | הוא משמש לבניית מערך עצים ריק שימוין בסדר עולה לפי הסדר הטבעי של מערך העצים. |
TreeSet(אוסף ג) | הוא משמש לבניית ערכת עצים חדשה המכילה את האלמנטים של האוסף c. |
TreeSet (השוואה להשוואה) | הוא משמש לבניית ערכת עצים ריקה שתמוין לפי המשווה נתון. |
TreeSet(SortedSet s) | הוא משמש לבניית TreeSet שמכיל את האלמנטים של SortedSet הנתון. |
שיטות של Java TreeSet Class
שיטה | תיאור |
---|---|
הוספה בוליאנית (E e) | הוא משמש להוספת הרכיב שצוין לקבוצה זו אם הוא עדיין לא קיים. |
boolean addAll(אוסף ג) | הוא משמש להוספת כל האלמנטים באוסף שצוין לקבוצה זו. |
תקרה E(E e) | הוא מחזיר את הרכיב השווה או הגדול ביותר של האלמנט שצוין מהקבוצה, או null אין אלמנט כזה. |
Comparator comparator() | זה מחזיר משווה שמסדר אלמנטים לפי הסדר. |
Iterator descendingIterator() | הוא משמש כדי לחזור על האלמנטים בסדר יורד. |
NavigableSet descendingSet() | זה מחזיר את האלמנטים בסדר הפוך. |
קומה E (E e) | הוא מחזיר את האלמנט השווה או הקרוב ביותר של האלמנט שצוין מהקבוצה, או null אין אלמנט כזה. |
SortedSet headSet(E toElement) | הוא מחזיר את קבוצת האלמנטים הנמוכים מהאלמנט שצוין. |
אוזניות NavigableSet (E toElement, כולל בוליאני) | הוא מחזיר את קבוצת האלמנטים שקטנים או שווים ל(אם, כולל זה נכון) לרכיב שצוין. |
E גבוה יותר (E e) | הוא מחזיר את האלמנט הגדול ביותר הקרוב ביותר של האלמנט שצוין מהקבוצה, או null אין אלמנט כזה. |
איטרטור איטרטור() | הוא משמש כדי לחזור על האלמנטים בסדר עולה. |
E נמוך יותר (E e) | זה מחזיר את האלמנט הכי פחות קרוב של האלמנט שצוין מהקבוצה, או null אין אלמנט כזה. |
E pollFirst() | הוא משמש כדי לאחזר ולהסיר את האלמנט הנמוך ביותר (הראשון). |
E pollLast() | הוא משמש כדי לאחזר ולהסיר את האלמנט הגבוה ביותר (האחרון). |
מפצל מפצל() | הוא משמש ליצירת מפצל מחייב מאוחר וכשל מהיר מעל האלמנטים. |
NavigableSet subset(E fromElement, Boolean fromInclusive, E toElement, Boolean toInclusive) | הוא מחזיר קבוצה של אלמנטים שנמצאים בין הטווח הנתון. |
SortedSet subset(E fromElement, E toElement)) | הוא מחזיר קבוצה של אלמנטים שנמצאים בין הטווח הנתון הכולל fromElement ואי כולל לElement. |
SortedSet tailSet(E fromElement) | הוא מחזיר קבוצה של אלמנטים שגדולים או שווים לאלמנט שצוין. |
NavigableSet tailSet (E fromElement, כולל בוליאני) | הוא מחזיר קבוצה של אלמנטים שגדולים או שווים לרכיב שצוין (אם, כולל זה נכון). |
בוליאני מכיל(Object o) | הוא מחזיר true אם קבוצה זו מכילה את האלמנט שצוין. |
boolean is Empty() | הוא מחזיר אמת אם קבוצה זו אינה מכילה אלמנטים. |
הסר בוליאני (Object o) | הוא משמש להסרת הרכיב שצוין מקבוצה זו אם הוא קיים. |
void clear() | הוא משמש להסרת כל האלמנטים מסט זה. |
שיבוט אובייקט() | הוא מחזיר עותק רדוד של מופע TreeSet זה. |
E ראשון() | הוא מחזיר את האלמנט הראשון (הנמוך ביותר) כרגע בקבוצה הממוינת הזו. |
E last() | הוא מחזיר את האלמנט האחרון (הגבוה ביותר) כרגע בקבוצה הממוינת הזו. |
int size() | הוא מחזיר את מספר האלמנטים בקבוצה זו. |
דוגמאות ל-Java 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()); } } }בדוק את זה עכשיו
תְפוּקָה:
system.out.println
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
נקה מטמון npm
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 לדוגמה: ספר
בוא נראה דוגמה של TreeSet שבה אנחנו מוסיפים ספרים לסט ומדפיסים את כל הספרים. האלמנטים ב-TreeSet חייבים להיות מסוג Comparable. כיתות מחרוזת ו-Wrapper ניתנות להשוואה כברירת מחדל. כדי להוסיף אובייקטים המוגדרים על ידי משתמש ב-TreeSet, עליך ליישם את ממשק Comparable.
שם קובץ: 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
אם נוסיף אובייקט של המחלקה שאינו מיישם את ממשק Comparable, החריגה של 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)
הֶסבֵּר: בתוכנית לעיל, נדרש ליישם ממשק Comparable. הסיבה לכך היא שה-TreeSet שומר על סדר המיון, וכדי לבצע את המיון, ההשוואה בין אובייקטים שונים שמוכנסים ל-TreeSet היא חובה, שמתבצעת על ידי יישום ממשק Comparable.