A Java TreeSet osztály a Set felületet valósítja meg, amely fát használ a tároláshoz. Megörökli az AbstractSet osztályt, és megvalósítja a NavigableSet interfészt. A TreeSet osztály objektumai növekvő sorrendben kerülnek tárolásra.
A Java TreeSet osztály legfontosabb pontjai a következők:
- A Java TreeSet osztály csak olyan egyedi elemeket tartalmaz, mint a HashSet.
- A Java TreeSet osztály elérési és visszakeresési ideje csendes, gyors.
- A Java TreeSet osztály nem engedélyezi a null elemet.
- A Java TreeSet osztály nincs szinkronizálva.
- A Java TreeSet osztály fenntartja a növekvő sorrendet.
- A Java TreeSet osztály csak olyan egyedi elemeket tartalmaz, mint a HashSet.
- A Java TreeSet osztály elérési és visszakeresési ideje meglehetősen gyors.
- A Java TreeSet osztály nem engedélyezi a null elemeket.
- A Java TreeSet osztály nem szinkronizált.
- A Java TreeSet osztály fenntartja a növekvő sorrendet.
- A TreeSet csak azokat az általános típusokat tudja engedélyezni, amelyek összehasonlíthatók. Például a Comparable interfészt a StringBuffer osztály valósítja meg.
A TreeSet osztály belső működése
A TreeSet egy bináris keresőfával valósult meg, amely önkiegyensúlyozó, mint egy vörös-fekete fa. Ezért az olyan műveletek, mint a keresés, eltávolítás és hozzáadás, O(log(N)) időt vesznek igénybe. Ennek oka az önkiegyensúlyozó fában van. Ez biztosítja, hogy a fa magassága soha ne haladja meg az O(log(N)) értéket az összes említett műveletnél. Ezért ez az egyik hatékony adatstruktúra a rendezett nagyméretű adatok megtartására és műveletek elvégzésére.
A TreeSet osztály szinkronizálása
Mint fentebb már említettük, a TreeSet osztály nincs szinkronizálva. Ez azt jelenti, hogy ha egynél több szál is hozzáfér egy fakészlethez, és az egyik hozzáférési szál módosítja azt, akkor a szinkronizálást manuálisan kell végrehajtani. Ez általában valamilyen objektum szinkronizálással történik, amely magába foglalja a halmazt. Abban az esetben azonban, ha nem található ilyen objektum, akkor a készletet a Collections.synchronizedSet() metódus segítségével kell csomagolni. Javasoljuk, hogy a módszert a létrehozás során használja, hogy elkerülje a készlet szinkronizálatlan elérését. A következő kódrészlet ugyanezt mutatja.
TreeSet treeSet = new TreeSet(); Set syncrSet = Collections.synchronziedSet(treeSet);
A TreeSet osztály hierarchiája
Amint a fenti diagramon látható, a Java TreeSet osztály valósítja meg a NavigableSet felületet. A NavigableSet felület hierarchikus sorrendben bővíti ki a SortedSet, Set, Collection és Iterable felületeket.
szikra bemutató
TreeSet osztálynyilatkozat
Lássuk a java.util.TreeSet osztály deklarációját.
public class TreeSet extends AbstractSet implements NavigableSet, Cloneable, Serializable
A Java TreeSet osztály konstruktőrei
Konstruktőr | Leírás |
---|---|
TreeSet() | Üres fakészlet létrehozására szolgál, amely növekvő sorrendbe kerül a fakészlet természetes sorrendjének megfelelően. |
Fakészlet (c gyűjtemény) | Egy új fakészlet felépítésére szolgál, amely a gyűjtemény elemeit tartalmazza c. |
TreeSet (összehasonlító összehasonlító) | Egy üres fahalmaz felépítésére szolgál, amely az adott összehasonlító szerint lesz rendezve. |
Fakészlet(rendezett halmazok) | Egy TreeSet felépítésére szolgál, amely az adott SortedSet elemeit tartalmazza. |
A Java TreeSet osztály módszerei
Módszer | Leírás |
---|---|
logikai összeadás(E e) | A megadott elem hozzáadására szolgál a halmazhoz, ha még nincs jelen. |
logikai addAll(c gyűjtemény) | Ez arra szolgál, hogy a megadott gyűjtemény összes elemét hozzáadja ehhez a halmazhoz. |
E mennyezet (E e) | A megadott elem egyenlő vagy legközelebbi legnagyobb elemét adja vissza a halmazból, vagy null nincs ilyen elem. |
Összehasonlító összehasonlító() | Egy komparátort ad vissza, amely az elemeket sorrendbe rendezi. |
Iterátor descendingIterator() | Az elemek csökkenő sorrendben történő iterálására szolgál. |
NavigableSet descendingSet() | Az elemeket fordított sorrendben adja vissza. |
E emelet (E e) | A megadott elem egyenlő vagy legközelebbi legkisebb elemét adja vissza a halmazból, vagy null nincs ilyen elem. |
SortedSet headSet (E to Element) | A megadott elemnél kisebb elemek csoportját adja vissza. |
NavigableSet headSet (E to Element, logikai értékkel együtt) | Visszaadja azoknak az elemeknek a csoportját, amelyek kisebbek vagy egyenlőek, mint a megadott elem (ha az inkluzív érték igaz). |
E magasabb (E e) | A megadott elem legközelebbi legnagyobb elemét adja vissza a halmazból, vagy nulla nincs ilyen elem. |
Iterátor iterátor() | Az elemek növekvő sorrendben történő iterálására szolgál. |
E alacsonyabb (E e) | A megadott elem legközelebbi legkisebb elemét adja vissza a halmazból, vagy nullát, ha nincs ilyen elem. |
E pollFirst() | A legalacsonyabb (első) elem lekérésére és eltávolítására szolgál. |
E pollLast() | A legmagasabb (utolsó) elem lekérésére és eltávolítására szolgál. |
Spliterator spliterator() | Késői kötésű és hibagyors elosztó létrehozására szolgál az elemek felett. |
NavigableSet részhalmaz (E-től elemtől, logikai értéktől inkluzív, E-től elemig, logikai értéktől inkluzívig) | Olyan elemek halmazát adja vissza, amelyek az adott tartomány között helyezkednek el. |
Rendezett halmaz részhalmaz (E elemtől, E elemig)) | Olyan elemek halmazát adja vissza, amelyek az adott tartomány között helyezkednek el, amely tartalmazza a fromElement-et és kizárja az elemet. |
SortedSet tailSet (E from Element) | Olyan elemkészletet ad vissza, amely nagyobb vagy egyenlő, mint a megadott elem. |
NavigableSet tailSet (E from Element, logikai értékkel együtt) | Olyan elemek halmazát adja vissza, amelyek nagyobbak vagy egyenlőek, mint a megadott elem (ha az inkluzív érték igaz). |
logikai érték tartalmazza (o objektum) | Igazat ad vissza, ha ez a halmaz tartalmazza a megadott elemet. |
logikai érték üres() | Igazat ad vissza, ha ez a halmaz nem tartalmaz elemeket. |
logikai eltávolítás (O-objektum) | A megadott elem eltávolítására szolgál ebből a halmazból, ha az jelen van. |
void clear() | A készlet összes elemének eltávolítására szolgál. |
Objektum klón() | A TreeSet példány sekély másolatát adja vissza. |
E először() | Az első (legalacsonyabb) elemet adja vissza ebben a rendezett halmazban. |
E utolsó() | Az utolsó (legmagasabb) elemet adja vissza ebben a rendezett halmazban. |
int size() | A készlet elemeinek számát adja vissza. |
Java TreeSet példák
Java TreeSet 1. példa:
Lássunk egy egyszerű példát a Java TreeSet-re.
alapvető java nyelv
Fájl név: 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()); } } }Tesztelje most
Kimenet:
Ajay Ravi Vijay
Java TreeSet 2. példa:
Nézzünk egy példát az elemek bejárására csökkenő sorrendben.
Fájl név: 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()); } } }Tesztelje most
Kimenet:
Traversing element through Iterator in descending order Vijay Ravi Ajay Traversing element through NavigableSet in descending order Vijay Ravi Ajay
Java TreeSet 3. példa:
Nézzünk egy példát a legmagasabb és legalacsonyabb érték lekérésére és eltávolítására.
Fájl név: TreeSet3.java
kicsomagolás linux alatt
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()); } }
Kimenet:
Lowest Value: 12 Highest Value: 66
Java TreeSet 4. példa:
Ebben a példában különféle NavigableSet műveleteket hajtunk végre.
Fájl név: 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)); } }
Kimenet:
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. példa:
Ebben a példában különféle SortedSetSet műveleteket hajtunk végre.
Fájl név: 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')); } }
Kimenet:
Intial Set: [A, B, C, D, E] Head Set: [A, B] SubSet: [A, B, C, D] TailSet: [C, D, E]
Java TreeSet Példa: Könyv
Nézzünk egy TreeSet példát, ahol könyveket adunk a készlethez, és kinyomtatjuk az összes könyvet. A TreeSet elemeinek Comparable típusúnak kell lenniük. A String és a Wrapper osztályok alapértelmezés szerint összehasonlíthatók. Felhasználó által definiált objektumok hozzáadásához a TreeSetben meg kell valósítania az Összehasonlítható felületet.
konvertálja a karakterláncot intergerré
Fájl név: 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 kivétel a TreeSetben
Ha hozzáadunk egy olyan objektumot az osztályhoz, amely nem valósítja meg a Comparable felületet, a ClassCast kivétel megjelenik. Vegye figyelembe a következő programot.
Fájl név: 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.'); } }
Amikor a fenti programot összeállítjuk, a ClassCastException-t kapjuk, ahogy az alább látható.
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)
Magyarázat: A fenti programban egy Comparable interfész megvalósítása szükséges. Ez azért van így, mert a TreeSet fenntartja a rendezési sorrendet, és a rendezéshez elengedhetetlen a TreeSetbe beszúrt különböző objektumok összehasonlítása, ami az Összehasonlítható felület megvalósításával valósítható meg.