Класът Java TreeSet имплементира интерфейса Set, който използва дърво за съхранение. Той наследява класа AbstractSet и имплементира интерфейса NavigableSet. Обектите на класа TreeSet се съхраняват във възходящ ред.
Важните точки относно класа Java TreeSet са:
- Класът Java TreeSet съдържа уникални елементи само като HashSet.
- Времената за достъп и извличане на класа на Java TreeSet са тихи и бързи.
- Класът Java TreeSet не позволява нулев елемент.
- Класът Java TreeSet не е синхронизиран.
- Класът Java TreeSet поддържа възходящ ред.
- Класът Java TreeSet съдържа уникални елементи само като HashSet.
- Времената за достъп и извличане на класа на Java TreeSet са доста бързи.
- Класът Java TreeSet не позволява нулеви елементи.
- Класът Java TreeSet не е синхронизиран.
- Класът Java TreeSet поддържа възходящ ред.
- TreeSet може да позволи само тези общи типове, които са сравними. Например интерфейсът Comparable се изпълнява от класа StringBuffer.
Вътрешна работа на класа TreeSet
TreeSet се прилага с помощта на двоично дърво за търсене, което се самобалансира точно като червено-черно дърво. Следователно операции като търсене, премахване и добавяне отнемат O(log(N)) време. Причината за това е в самобалансиращото се дърво. Той е там, за да гарантира, че височината на дървото никога не надвишава O(log(N)) за всички споменати операции. Следователно това е една от ефективните структури от данни, за да се запазят големите данни, които са сортирани, както и да се извършват операции върху тях.
Синхронизиране на класа TreeSet
Както вече беше споменато по-горе, класът TreeSet не е синхронизиран. Това означава, че ако повече от една нишка едновременно има достъп до набор от дърво и една от нишките с достъп го промени, тогава синхронизирането трябва да се извърши ръчно. Обикновено се прави чрез извършване на някаква синхронизация на обекти, която капсулира набора. Въпреки това, в случай, че не бъде намерен такъв обект, тогава наборът трябва да бъде обвит с помощта на метода Collections.synchronizedSet(). Препоръчително е да използвате метода по време на създаването, за да избегнете несинхронизирания достъп на комплекта. Следният кодов фрагмент показва същото.
TreeSet treeSet = new TreeSet(); Set syncrSet = Collections.synchronziedSet(treeSet);
Йерархия на клас TreeSet
Както е показано на горната диаграма, класът Java TreeSet имплементира интерфейса NavigableSet. Интерфейсът NavigableSet разширява интерфейсите SortedSet, Set, Collection и Iterable в йерархичен ред.
урок за hadoop
Декларация на клас TreeSet
Нека да видим декларацията за класа java.util.TreeSet.
public class TreeSet extends AbstractSet implements NavigableSet, Cloneable, Serializable
Конструктори на Java TreeSet Class
Конструктор | Описание |
---|---|
TreeSet() | Използва се за конструиране на празно дърво, което ще бъде сортирано във възходящ ред според естествения ред на дървовидния набор. |
TreeSet (Колекция c) | Използва се за изграждане на нов дървовиден набор, който съдържа елементите на колекцията c. |
TreeSet (компаратор за сравнение) | Използва се за конструиране на празно дърво, което ще бъде сортирано според дадения компаратор. |
TreeSet(SortedSet s) | Използва се за изграждане на TreeSet, който съдържа елементите на дадения SortedSet. |
Методи на Java TreeSet Class
Метод | Описание |
---|---|
булево добавяне (E e) | Използва се за добавяне на посочения елемент към този набор, ако той вече не присъства. |
булево addAll(Колекция c) | Използва се за добавяне на всички елементи в указаната колекция към този набор. |
E таван (E e) | Връща равния или най-близкия най-голям елемент от посочения елемент от набора или null, ако няма такъв елемент. |
Comparator comparator() | Той връща компаратор, който подрежда елементите в ред. |
Итератор descendingIterator() | Използва се за итерация на елементите в низходящ ред. |
NavigableSet descendingSet() | Връща елементите в обратен ред. |
E етаж (E e) | Връща равния или най-близкия най-малък елемент от посочения елемент от набора или null, ако няма такъв елемент. |
SortedSet headSet(E toElement) | Връща групата елементи, които са по-малки от зададения елемент. |
NavigableSet headSet(E toElement, boolean inclusive) | Връща групата елементи, които са по-малки или равни на (ако включително е вярно) посочения елемент. |
E по-високо (E e) | Връща най-близкия най-голям елемент от посочения елемент от набора или null, ако няма такъв елемент. |
Итератор iterator() | Използва се за повторение на елементите във възходящ ред. |
E по-ниско (E e) | Връща най-близкия най-малък елемент от посочения елемент от набора или null, ако няма такъв елемент. |
E pollFirst() | Използва се за извличане и премахване на най-ниския (първи) елемент. |
E pollLast() | Използва се за извличане и премахване на най-високия (последен) елемент. |
Spliterator spliterator() | Използва се за създаване на късно свързване и бърз сплитератор върху елементите. |
NavigableSet subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) | Той връща набор от елементи, които се намират между дадения диапазон. |
SortedSet subSet(E fromElement, E toElement)) | Той връща набор от елементи, които се намират между дадения диапазон, който включва fromElement и изключва toElement. |
SortedSet tailSet(E fromElement) | Той връща набор от елементи, които са по-големи или равни на посочения елемент. |
NavigableSet tailSet(E fromElement, boolean inclusive) | Той връща набор от елементи, които са по-големи или равни на (ако включително е вярно) посочения елемент. |
boolean съдържа (обект o) | Връща true, ако този набор съдържа посочения елемент. |
булево isEmpty() | Връща true, ако този набор не съдържа елементи. |
булево премахване (обект o) | Използва се за премахване на посочения елемент от този набор, ако той присъства. |
void clear() | Използва се за премахване на всички елементи от този комплект. |
Клониране на обект () | Той връща плитко копие на този екземпляр на TreeSet. |
E първо () | Той връща първия (най-нисък) елемент в момента в този сортиран набор. |
E последно() | Връща последния (най-висок) елемент в момента в този сортиран набор. |
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()); } } }Тествайте сега
Изход:
Ajay Ravi Vijay
Java TreeSet Пример 2:
Нека видим пример за обхождане на елементи в низходящ ред.
как да получите достъп до снимки в icloud
Име на файл: 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
java цяло число към низ
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')); } }
Изход:
не е равно на mysql
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. Класовете String и Wrapper са Comparable по подразбиране. За да добавите дефинирани от потребителя обекти в 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)
Обяснение: В горната програма е необходимо да се внедри сравним интерфейс. Това е така, защото TreeSet поддържа реда на сортиране и за извършване на сортирането е необходимо сравнението на различни обекти, които се вмъкват в TreeSet, което се постига чрез прилагане на интерфейса Comparable.