Clasa Java TreeSet implementează interfața Set care utilizează un arbore pentru stocare. Moștenește clasa AbstractSet și implementează interfața NavigableSet. Obiectele clasei TreeSet sunt stocate în ordine crescătoare.
Punctele importante despre clasa Java TreeSet sunt:
- Clasa Java TreeSet conține elemente unice doar ca HashSet.
- Accesul la clasa Java TreeSet și timpii de recuperare sunt rapid și liniștiți.
- Clasa Java TreeSet nu permite elementul nul.
- Clasa Java TreeSet nu este sincronizată.
- Clasa Java TreeSet menține ordinea crescătoare.
- Clasa Java TreeSet conține elemente unice doar ca HashSet.
- Accesul la clasa Java TreeSet și timpii de recuperare sunt destul de rapidi.
- Clasa Java TreeSet nu permite elemente nule.
- Clasa Java TreeSet este nesincronizată.
- Clasa Java TreeSet menține ordinea crescătoare.
- TreeSet poate permite numai acele tipuri generice care sunt comparabile. De exemplu, Interfața Comparable este implementată de clasa StringBuffer.
Funcționarea internă a clasei TreeSet
TreeSet este implementat folosind un arbore de căutare binar, care se auto-echilibrează la fel ca un arbore roșu-negru. Prin urmare, operațiuni precum căutarea, eliminarea și adăugarea consumă timp O(log(N)). Motivul din spatele acestui lucru este acolo în arborele de auto-echilibrare. Este acolo pentru a se asigura că înălțimea arborelui nu depășește niciodată O(log(N)) pentru toate operațiunile menționate. Prin urmare, este una dintre structurile de date eficiente pentru a păstra datele mari care sunt sortate și, de asemenea, pentru a face operațiuni pe acestea.
Sincronizarea clasei TreeSet
După cum am menționat deja mai sus, clasa TreeSet nu este sincronizată. Înseamnă că dacă mai multe fire de execuție accesează simultan un set de arbore, iar unul dintre firele de execuție care accesează îl modifică, atunci sincronizarea trebuie făcută manual. De obicei, se face prin sincronizarea obiectelor care încapsulează setul. Totuși, în cazul în care nu se găsește un astfel de obiect, atunci setul trebuie împachetat cu ajutorul metodei Collections.synchronizedSet(). Se recomandă utilizarea metodei în timpul creării pentru a evita accesul nesincronizat al setului. Următorul fragment de cod arată același lucru.
TreeSet treeSet = new TreeSet(); Set syncrSet = Collections.synchronziedSet(treeSet);
Ierarhia clasei TreeSet
După cum se arată în diagrama de mai sus, clasa Java TreeSet implementează interfața NavigableSet. Interfața NavigableSet extinde interfețele SortedSet, Set, Collection și Iterable în ordine ierarhică.
diferenta simetrica
Declarație de clasă TreeSet
Să vedem declarația pentru clasa java.util.TreeSet.
public class TreeSet extends AbstractSet implements NavigableSet, Cloneable, Serializable
Constructorii clasei Java TreeSet
Constructor | Descriere |
---|---|
TreeSet() | Este folosit pentru a construi un set de arbori gol care va fi sortat în ordine crescătoare conform ordinii naturale a setului de arbori. |
TreeSet(Colecția c) | Este folosit pentru a construi un nou set de arbori care conține elementele colecției c. |
TreeSet(Comparator comparator) | Este folosit pentru a construi un set de arbore gol care va fi sortat în funcție de comparatorul dat. |
TreeSet(SortedSet s) | Este folosit pentru a construi un TreeSet care conține elementele SortedSet-ului dat. |
Metode ale clasei Java TreeSet
Metodă | Descriere |
---|---|
adăugare booleană (E e) | Este folosit pentru a adăuga elementul specificat la acest set dacă nu este deja prezent. |
boolean addAll(Colecția c) | Este folosit pentru a adăuga toate elementele din colecția specificată la acest set. |
E plafon (E e) | Returnează cel mai mare element egal sau cel mai apropiat al elementului specificat din set, sau null nu există un astfel de element. |
Comparator comparator() | Returnează un comparator care aranjează elementele în ordine. |
Iterator descendentIterator() | Este folosit pentru a repeta elementele în ordine descrescătoare. |
NavigableSet descendingSet() | Returnează elementele în ordine inversă. |
E etaj(E e) | Returnează elementul cel mai mic egal sau cel mai apropiat al elementului specificat din set, sau null nu există un astfel de element. |
SortedSet headSet (E laElement) | Returnează grupul de elemente care sunt mai mici decât elementul specificat. |
NavigableSet headSet (E laElement, boolean inclusiv) | Returnează grupul de elemente care sunt mai mici sau egale cu (dacă, inclusiv este adevărat) elementul specificat. |
E mai mare (E e) | Returnează cel mai apropiat element cel mai mare al elementului specificat din set, sau null nu există un astfel de element. |
Iterator iterator() | Este folosit pentru a repeta elementele în ordine crescătoare. |
E mai jos (E e) | Returnează cel mai apropiat element cel mai mic al elementului specificat din set, sau null nu există un astfel de element. |
E pollFirst() | Este folosit pentru a prelua și elimina elementul cel mai de jos (primul). |
E sondajLast() | Este folosit pentru a prelua și elimina cel mai înalt (ultimul) element. |
Spliterator spliterator() | Este folosit pentru a crea un spliterator de legare tardivă și de eșec rapid peste elemente. |
NavigableSet subSet (E dinElement, boolean dinInclusiv, E pentruElement, boolean pentruInclusiv) | Returnează un set de elemente care se află între intervalul dat. |
SortedSet subSet (E dinElement, E cătreElement)) | Returnează un set de elemente care se află între intervalul dat, care include fromElement și exclude toElement. |
SortedSet tailSet (E dinElement) | Returnează un set de elemente care sunt mai mari sau egale cu elementul specificat. |
NavigableSet tailSet (E dinElement, boolean inclusiv) | Returnează un set de elemente care sunt mai mari sau egale cu (dacă, inclusiv este adevărat) elementul specificat. |
boolean conține (Obiect o) | Returnează adevărat dacă acest set conține elementul specificat. |
boolean este gol () | Returnează adevărat dacă acest set nu conține elemente. |
eliminare boolean (obiect o) | Este folosit pentru a elimina elementul specificat din acest set dacă este prezent. |
void clear() | Este folosit pentru a elimina toate elementele din acest set. |
Clona obiect() | Returnează o copie superficială a acestei instanțe TreeSet. |
E primul() | Returnează primul (cel mai mic) element în prezent din acest set sortat. |
E ultimul() | Returnează ultimul (cel mai înalt) element din acest set sortat. |
dimensiune int() | Returnează numărul de elemente din acest set. |
Exemple Java TreeSet
Java TreeSet Exemplul 1:
Să vedem un exemplu simplu de Java TreeSet.
Nume de fișier: TreeSet1.java
algoritmul lui 'prim'
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()); } } }Testează-l acum
Ieșire:
Ajay Ravi Vijay
Java TreeSet Exemplul 2:
Să vedem un exemplu de parcurgere a elementelor în ordine descrescătoare.
Nume de fișier: 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()); } } }Testează-l acum
Ieșire:
Traversing element through Iterator in descending order Vijay Ravi Ajay Traversing element through NavigableSet in descending order Vijay Ravi Ajay
Java TreeSet Exemplul 3:
Să vedem un exemplu pentru a prelua și elimina valoarea cea mai mare și cea mai mică.
Nume de fișier: TreeSet3.java
ce este hashmap 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()); } }
Ieșire:
Lowest Value: 12 Highest Value: 66
Java TreeSet Exemplul 4:
În acest exemplu, efectuăm diverse operații NavigableSet.
Nume de fișier: TreeSet4.java
755 chmod
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)); } }
Ieșire:
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 Exemplul 5:
În acest exemplu, efectuăm diverse operații SortedSetSet.
Nume de fișier: 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')); } }
Ieșire:
Intial Set: [A, B, C, D, E] Head Set: [A, B] SubSet: [A, B, C, D] TailSet: [C, D, E]
Exemplu Java TreeSet: Carte
Să vedem un exemplu de TreeSet în care adăugăm cărți la set și tipărim toate cărțile. Elementele din TreeSet trebuie să fie de tip Comparabil. Clasele String și Wrapper sunt comparabile în mod implicit. Pentru a adăuga obiecte definite de utilizator în TreeSet, trebuie să implementați interfața Comparable.
Nume de fișier: 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){>
Excepție ClassCast în TreeSet
Dacă adăugăm un obiect al clasei care nu implementează interfața Comparable, este ridicată excepția ClassCast. Respectați următorul program.
Nume de fișier: ClassCastExceptionTreeSet.java
df.loc
// 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.'); } }
Când compilam programul de mai sus, obținem ClassCastException, așa cum se arată mai jos.
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)
Explicaţie: În programul de mai sus, este necesară implementarea unei interfețe comparabile. Acest lucru se datorează faptului că TreeSet menține ordinea de sortare, iar pentru a face sortarea este necesară compararea diferitelor obiecte care sunt inserate în TreeSet, ceea ce se realizează prin implementarea interfeței Comparable.