Trieda Java TreeSet implementuje rozhranie Set, ktoré používa strom na ukladanie. Zdedí triedu AbstractSet a implementuje rozhranie NavigableSet. Objekty triedy TreeSet sú uložené vo vzostupnom poradí.
Dôležité body o triede Java TreeSet sú:
- Trieda Java TreeSet obsahuje iba jedinečné prvky ako HashSet.
- Prístup k triede Java TreeSet a časy načítania sú veľmi rýchle.
- Trieda Java TreeSet nepovoľuje nulový prvok.
- Trieda Java TreeSet nie je synchronizovaná.
- Trieda Java TreeSet udržiava vzostupné poradie.
- Trieda Java TreeSet obsahuje iba jedinečné prvky ako HashSet.
- Časy prístupu k triede Java TreeSet a získavania sú pomerne rýchle.
- Trieda Java TreeSet nepovoľuje prvky null.
- Trieda Java TreeSet je nesynchronizovaná.
- Trieda Java TreeSet udržiava vzostupné poradie.
- TreeSet môže povoliť len tie generické typy, ktoré sú porovnateľné. Napríklad rozhranie Comparable je implementované triedou StringBuffer.
Interné fungovanie triedy TreeSet
TreeSet sa implementuje pomocou binárneho vyhľadávacieho stromu, ktorý je samovyvažujúci rovnako ako červeno-čierny strom. Preto operácie ako vyhľadávanie, odstraňovanie a pridávanie spotrebúvajú O(log(N)) čas. Dôvod je v samovyvažujúcom strome. Slúži na to, aby výška stromu nikdy neprekročila O(log(N)) pre všetky uvedené operácie. Preto je to jedna z efektívnych dátových štruktúr na uchovanie veľkých dát, ktoré sú triedené a tiež na vykonávanie operácií s nimi.
Synchronizácia triedy The TreeSet
Ako už bolo spomenuté vyššie, trieda TreeSet nie je synchronizovaná. To znamená, že ak viac ako jedno vlákno súčasne pristupuje k množine stromov a jedno z pristupujúcich vlákien ho upravuje, synchronizácia musí byť vykonaná manuálne. Zvyčajne sa to robí vykonaním nejakej synchronizácie objektov, ktorá zapuzdruje množinu. V prípade, že sa takýto objekt nenájde, potom je potrebné množinu zabaliť pomocou metódy Collections.synchronizedSet(). Odporúča sa použiť túto metódu počas vytvárania, aby ste sa vyhli nesynchronizovanému prístupu súpravy. Nasledujúci útržok kódu zobrazuje to isté.
TreeSet treeSet = new TreeSet(); Set syncrSet = Collections.synchronziedSet(treeSet);
Hierarchia triedy TreeSet
Ako je znázornené na obrázku vyššie, trieda Java TreeSet implementuje rozhranie NavigableSet. Rozhranie NavigableSet rozširuje rozhrania SortedSet, Set, Collection a Iterable v hierarchickom poradí.
tlačidlo na vycentrovanie css
Deklarácia triedy TreeSet
Pozrime sa na deklaráciu pre triedu java.util.TreeSet.
public class TreeSet extends AbstractSet implements NavigableSet, Cloneable, Serializable
Konštruktory triedy Java TreeSet
Konštruktér | Popis |
---|---|
TreeSet() | Používa sa na zostavenie prázdnej množiny stromov, ktorá bude zoradená vzostupne podľa prirodzeného poradia množiny stromov. |
Sada stromov (kolekcia c) | Používa sa na vytvorenie novej sady stromov, ktorá obsahuje prvky kolekcie c. |
TreeSet (porovnávač komparátorov) | Používa sa na zostavenie prázdnej množiny stromov, ktorá bude zoradená podľa daného komparátora. |
Sada stromov (SortedSet s) | Používa sa na zostavenie TreeSet, ktorý obsahuje prvky danej SortedSet. |
Metódy triedy Java TreeSet
Metóda | Popis |
---|---|
boolovské sčítanie (E e) | Používa sa na pridanie špecifikovaného prvku do tejto množiny, ak ešte nie je prítomný. |
boolean addAll(kolekcia c) | Používa sa na pridanie všetkých prvkov v zadanej kolekcii do tejto sady. |
E strop (E e) | Vráti rovnaký alebo najbližší najväčší prvok zadaného prvku z množiny alebo hodnotu null, taký prvok neexistuje. |
komparátor komparátor() | Vráti komparátor, ktorý usporiada prvky v poradí. |
Iterátor zostupneIterator() | Používa sa na iteráciu prvkov v zostupnom poradí. |
NavigableSet descendingSet() | Prvky vracia v opačnom poradí. |
E poschodie (E e) | Vráti rovnaký alebo najmenší prvok zadaného prvku z množiny alebo hodnotu null, taký prvok neexistuje. |
SortedSet headset (E toElement) | Vráti skupinu prvkov, ktoré sú menšie ako zadaný prvok. |
HeadSet NavigableSet (E toElement, vrátane booleovských hodnôt) | Vráti skupinu prvkov, ktoré sú menšie alebo rovné (ak, vrátane je pravda) zadanému prvku. |
E vyššie (E e) | Vráti najbližší najväčší prvok zadaného prvku z množiny alebo hodnotu null, taký prvok neexistuje. |
Iterátor iterátor() | Používa sa na iteráciu prvkov vo vzostupnom poradí. |
E nižšie (E e) | Vráti najbližší najmenší prvok zadaného prvku z množiny alebo hodnotu null, taký prvok neexistuje. |
E pollFirst() | Používa sa na získanie a odstránenie najnižšieho (prvého) prvku. |
E pollLast() | Používa sa na získanie a odstránenie najvyššieho (posledného) prvku. |
Spliterator spliterator() | Používa sa na vytvorenie rozdeľovača pre neskoré viazanie a rýchleho zlyhania nad prvkami. |
Podmnožina NavigableSet (E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) | Vráti množinu prvkov, ktoré ležia medzi daným rozsahom. |
SortedSet subset(E fromElement, E toElement)) | Vráti množinu prvkov, ktoré ležia medzi daným rozsahom, ktorý zahŕňa fromElement a vylučuje toElement. |
SortedSet tailSet(E fromElement) | Vráti množinu prvkov, ktoré sú väčšie alebo rovné zadanému prvku. |
NavigableSet tailSet(E fromElement, vrátane booleovských hodnôt) | Vracia množinu prvkov, ktoré sú väčšie alebo rovné (ak vrátane je pravda) zadanému prvku. |
boolean obsahuje (Objekt o) | Ak táto množina obsahuje zadaný prvok, vráti hodnotu true. |
boolean isEmpty() | Ak táto množina neobsahuje žiadne prvky, vráti hodnotu true. |
boolovské odstránenie (objekt o) | Používa sa na odstránenie špecifikovaného prvku z tejto množiny, ak je prítomný. |
void clear() | Používa sa na odstránenie všetkých prvkov z tejto sady. |
Object clone() | Vráti plytkú kópiu tejto inštancie TreeSet. |
E prvý() | Vráti prvý (najnižší) prvok momentálne v tejto zoradenej množine. |
E posledný() | Vráti posledný (najvyšší) prvok momentálne v tejto zoradenej množine. |
int size() | Vráti počet prvkov v tejto množine. |
Príklady Java TreeSet
Príklad 1 Java TreeSet:
Pozrime sa na jednoduchý príklad Java TreeSet.
Názov súboru: TreeSet1.java
porovnateľný reťazec v jazyku 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()); } } }Vyskúšajte to
Výkon:
Ajay Ravi Vijay
Príklad 2 Java TreeSet:
Pozrime sa na príklad prechodu prvkov v zostupnom poradí.
Názov súboru: 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()); } } }Vyskúšajte to
Výkon:
Traversing element through Iterator in descending order Vijay Ravi Ajay Traversing element through NavigableSet in descending order Vijay Ravi Ajay
Príklad 3 Java TreeSet:
Pozrime sa na príklad na získanie a odstránenie najvyššej a najnižšej hodnoty.
Názov súboru: TreeSet3.java
pre slučky 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()); } }
Výkon:
Lowest Value: 12 Highest Value: 66
Príklad 4 Java TreeSet:
V tomto príklade vykonávame rôzne operácie NavigableSet.
Názov súboru: TreeSet4.java
java celé číslo na reťazec
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)); } }
Výkon:
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 Príklad 5:
V tomto príklade vykonávame rôzne operácie SortedSetSet.
Názov súboru: 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')); } }
Výkon:
Intial Set: [A, B, C, D, E] Head Set: [A, B] SubSet: [A, B, C, D] TailSet: [C, D, E]
Príklad Java TreeSet: Kniha
Pozrime sa na príklad TreeSet, kde pridávame knihy do sady a tlačíme všetky knihy. Prvky v množine stromov musia byť typu Porovnateľné. Triedy String a Wrapper sú štandardne porovnateľné. Ak chcete do TreeSet pridať objekty definované používateľom, musíte implementovať rozhranie Comparable.
Názov súboru: 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){>
Výnimka ClassCast v TreeSet
Ak pridáme objekt triedy, ktorý neimplementuje rozhranie Comparable, vyvolá sa výnimka ClassCast. Dodržujte nasledujúci program.
Názov súboru: ClassCastExceptionTreeSet.java
nahradiť farbu v gimp
// 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.'); } }
Keď skompilujeme vyššie uvedený program, dostaneme ClassCastException, ako je uvedené nižšie.
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)
Vysvetlenie: Vo vyššie uvedenom programe je potrebné implementovať porovnateľné rozhranie. Je to preto, že TreeSet zachováva poradie triedenia a na vykonanie triedenia je nevyhnutné porovnanie rôznych objektov, ktoré sa vkladajú do TreeSet, čo sa dosiahne implementáciou rozhrania Comparable.