Klasa Java TreeSet implementuje interfejs Set, który wykorzystuje drzewo do przechowywania. Dziedziczy klasę AbstractSet i implementuje interfejs NavigableSet. Obiekty klasy TreeSet przechowywane są w kolejności rosnącej.
Ważne punkty dotyczące klasy Java TreeSet to:
- Klasa Java TreeSet zawiera tylko unikalne elementy, takie jak HashSet.
- Czasy dostępu i pobierania klas Java TreeSet są bardzo szybkie.
- Klasa Java TreeSet nie zezwala na element null.
- Klasa Java TreeSet nie jest zsynchronizowana.
- Klasa Java TreeSet utrzymuje porządek rosnący.
- Klasa Java TreeSet zawiera tylko unikalne elementy, takie jak HashSet.
- Czasy dostępu i pobierania klas Java TreeSet są dość krótkie.
- Klasa Java TreeSet nie zezwala na elementy null.
- Klasa Java TreeSet nie jest zsynchronizowana.
- Klasa Java TreeSet utrzymuje porządek rosnący.
- TreeSet może zezwalać tylko na te typy ogólne, które są porównywalne. Na przykład interfejs Comparable jest implementowany przez klasę StringBuffer.
Wewnętrzne działanie klasy TreeSet
TreeSet jest wdrażany przy użyciu drzewa wyszukiwania binarnego, które samobalansuje się podobnie jak drzewo czerwono-czarne. Dlatego operacje takie jak wyszukiwanie, usuwanie i dodawanie zużywają czas O(log(N)). Przyczyna tego leży w drzewie samorównoważącym. Ma to na celu zapewnienie, że wysokość drzewa nigdy nie przekroczy O(log(N)) dla wszystkich wymienionych operacji. Dlatego jest to jedna z wydajnych struktur danych do przechowywania dużych danych, które są sortowane, a także do wykonywania na nich operacji.
Synchronizacja klasy TreeSet
Jak już wspomniano powyżej, klasa TreeSet nie jest zsynchronizowana. Oznacza to, że jeśli więcej niż jeden wątek uzyskuje jednocześnie dostęp do zbioru drzewa, a jeden z wątków uzyskujących dostęp zmodyfikuje go, wówczas synchronizację należy przeprowadzić ręcznie. Zwykle odbywa się to poprzez synchronizację obiektów, która hermetyzuje zestaw. Jeżeli jednak taki obiekt nie zostanie znaleziony, wówczas zbiór należy opakować przy pomocy metody Collections.synchronizedSet(). Zaleca się stosowanie tej metody w czasie tworzenia, aby uniknąć niezsynchronizowanego dostępu do zbioru. Poniższy fragment kodu pokazuje to samo.
TreeSet treeSet = new TreeSet(); Set syncrSet = Collections.synchronziedSet(treeSet);
Hierarchia klasy TreeSet
Jak pokazano na powyższym diagramie, klasa Java TreeSet implementuje interfejs NavigableSet. Interfejs NavigableSet rozszerza interfejsy SortedSet, Set, Collection i Iterable w porządku hierarchicznym.
co to jest hashset Java
Deklaracja klasy TreeSet
Zobaczmy deklarację klasy java.util.TreeSet.
public class TreeSet extends AbstractSet implements NavigableSet, Cloneable, Serializable
Konstruktorzy klasy Java TreeSet
Konstruktor | Opis |
---|---|
Zestaw Drzewa() | Służy do konstruowania pustego zbioru drzew, który będzie posortowany w porządku rosnącym, zgodnie z naturalnym porządkiem zbioru drzew. |
TreeSet (kolekcja c) | Służy do budowy nowego zestawu drzewiastego zawierającego elementy kolekcji c. |
TreeSet (komparator komparatora) | Służy do konstruowania pustego zbioru drzew, który będzie posortowany według zadanego komparatora. |
TreeSet(SortedSet s) | Służy do zbudowania TreeSet, który zawiera elementy danego SortedSet. |
Metody klasy Java TreeSet
metoda | Opis |
---|---|
wartość logiczna add(E e) | Służy do dodania określonego elementu do tego zestawu, jeśli jeszcze go nie ma. |
wartość logiczna addAll (kolekcja c) | Służy do dodania wszystkich elementów z określonej kolekcji do tego zestawu. |
E sufit(E e) | Zwraca równy lub najbliższy największy element określonego elementu ze zbioru lub null nie ma takiego elementu. |
Komparator komparator() | Zwraca komparator, który porządkuje elementy. |
Iterator malejącyIterator() | Służy do iteracji elementów w kolejności malejącej. |
NavigableSet malejącoSet() | Zwraca elementy w odwrotnej kolejności. |
E piętro(E e) | Zwraca równy lub najbliższy najmniejszy element określonego elementu ze zbioru lub null nie ma takiego elementu. |
SortedSet headSet(E doElement) | Zwraca grupę elementów mniejszych niż określony element. |
NavigableSet headSet(E doElement, wartość logiczna włącznie) | Zwraca grupę elementów, które są mniejsze lub równe (jeśli włącznie jest prawdą) określonego elementu. |
E wyższy(E e) | Zwraca najbliższy największy element określonego elementu ze zbioru lub null nie ma takiego elementu. |
Iterator iterator() | Służy do iteracji elementów w kolejności rosnącej. |
E niższy(E e) | Zwraca najbliższy najmniejszy element określonego elementu ze zbioru lub null nie ma takiego elementu. |
E ankietaFirst() | Służy do pobierania i usuwania najniższego (pierwszego) elementu. |
E ankietaOstatnia() | Służy do pobierania i usuwania najwyższego (ostatniego) elementu. |
Rozdzielacz Rozdzielacz() | Służy do tworzenia późnego wiązania i szybkiego rozdzielania elementów. |
Zestaw nawigacyjny podzbiór (E z elementu, wartość logiczna z elementu włącznie, E do elementu, wartość logiczna z elementem włącznie) | Zwraca zbiór elementów znajdujących się pomiędzy podanym zakresem. |
SortedSet podzbiór(E z elementu, E do elementu)) | Zwraca zestaw elementów znajdujących się pomiędzy podanym zakresem, który obejmuje fromElement i wyklucza toElement. |
SortedSet tailSet(E z elementu) | Zwraca zestaw elementów, które są większe lub równe określonemu elementowi. |
NavigableSet tailSet(E z elementu, wartość logiczna włącznie) | Zwraca zestaw elementów, które są większe lub równe (jeśli włącznie ma wartość true) określonemu elementowi. |
wartość logiczna zawiera (obiekt o) | Zwraca wartość true, jeśli ten zestaw zawiera określony element. |
wartość logiczna jest pusta() | Zwraca wartość true, jeśli ten zestaw nie zawiera żadnych elementów. |
wartość logiczna usuń (obiekt o) | Służy do usunięcia określonego elementu z tego zestawu, jeśli jest obecny. |
puste jasne() | Służy do usuwania wszystkich elementów z tego zestawu. |
Klon obiektu() | Zwraca płytką kopię tej instancji TreeSet. |
Najpierw E() | Zwraca pierwszy (najniższy) element znajdujący się obecnie w tym posortowanym zestawie. |
E ostatni() | Zwraca ostatni (najwyższy) element aktualnie w tym posortowanym zestawie. |
rozmiar całkowity() | Zwraca liczbę elementów w tym zestawie. |
Przykłady zestawu drzew Java
Przykład zestawu Java TreeSet 1:
Zobaczmy prosty przykład Java TreeSet.
Nazwa pliku: TreeSet1.java
to jest
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()); } } }Przetestuj teraz
Wyjście:
Ajay Ravi Vijay
Przykład 2 zestawu Java TreeSet:
Zobaczmy przykład przechodzenia elementów w kolejności malejącej.
Nazwa pliku: 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()); } } }Przetestuj teraz
Wyjście:
Traversing element through Iterator in descending order Vijay Ravi Ajay Traversing element through NavigableSet in descending order Vijay Ravi Ajay
Przykład zestawu Java TreeSet 3:
Zobaczmy przykład pobierania i usuwania najwyższej i najniższej wartości.
Nazwa pliku: TreeSet3.java
och sns
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()); } }
Wyjście:
Lowest Value: 12 Highest Value: 66
Przykład zestawu Java TreeSet 4:
W tym przykładzie wykonujemy różne operacje NavigableSet.
Nazwa pliku: TreeSet4.java
częściowo pochodny lateks
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)); } }
Wyjście:
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]
Przykład zestawu Java TreeSet 5:
W tym przykładzie wykonujemy różne operacje SortedSetSet.
Nazwa pliku: 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')); } }
Wyjście:
Intial Set: [A, B, C, D, E] Head Set: [A, B] SubSet: [A, B, C, D] TailSet: [C, D, E]
Przykład Java TreeSet: Książka
Zobaczmy przykład TreeSet, w którym dodajemy książki do zestawu i drukujemy wszystkie książki. Elementy w TreeSet muszą być typu Comparable. Klasy String i Wrapper są domyślnie porównywalne. Aby dodać obiekty zdefiniowane przez użytkownika w TreeSet, musisz zaimplementować interfejs Comparable.
Nazwa pliku: 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){>
Wyjątek ClassCast w TreeSet
Jeśli dodamy obiekt klasy, który nie implementuje interfejsu Comparable, zostanie zgłoszony wyjątek ClassCast. Przestrzegaj poniższego programu.
Nazwa pliku: ClassCastExceptionTreeSet.java
data do ciągu
// 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.'); } }
Kiedy kompilujemy powyższy program, otrzymujemy wyjątek ClassCastException, jak pokazano poniżej.
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)
Wyjaśnienie: W powyższym programie wymagana jest implementacja interfejsu Comparable. Dzieje się tak dlatego, że TreeSet utrzymuje porządek sortowania, a do sortowania konieczne jest porównanie różnych obiektów wstawianych do TreeSet, co osiąga się poprzez implementację interfejsu Comparable.