Java TreeSet (με παραδείγματα)

Σε αυτό το σεμινάριο, θα μάθουμε για την κλάση Java TreeSet και τις διάφορες λειτουργίες και μεθόδους με τη βοήθεια παραδειγμάτων.

Η TreeSetκλάση του πλαισίου συλλογών Java παρέχει τη λειτουργικότητα μιας δομής δεδομένων δέντρου.

Επεκτείνει τη διεπαφή NavigableSet.

Δημιουργία TreeSet

Για να δημιουργήσουμε ένα σύνολο δέντρων, πρέπει java.util.TreeSetπρώτα να εισαγάγουμε το πακέτο.

Μόλις εισαγάγουμε το πακέτο, εδώ είναι πώς μπορούμε να δημιουργήσουμε ένα TreeSetJava.

  TreeSet numbers = new TreeSet(); 

Εδώ, δημιουργήσαμε ένα TreeSetχωρίς ορίσματα. Σε αυτήν την περίπτωση, τα στοιχεία TreeSetταξινομούνται φυσικά (αύξουσα σειρά).

Ωστόσο, μπορούμε να προσαρμόσουμε την ταξινόμηση των στοιχείων χρησιμοποιώντας τη Comparatorδιεπαφή. Θα μάθουμε για αυτό αργότερα σε αυτό το σεμινάριο.

Μέθοδοι του TreeSet

Η TreeSetτάξη παρέχει διάφορες μεθόδους που μας επιτρέπουν να εκτελούμε διάφορες λειτουργίες στο σετ.

Εισαγωγή στοιχείων στο TreeSet

  • add() - εισάγει το καθορισμένο στοιχείο στο σύνολο
  • addAll() - εισάγει όλα τα στοιχεία της καθορισμένης συλλογής στο σύνολο

Για παράδειγμα,

 import java.util.TreeSet; class Main ( public static void main(String() args) ( TreeSet evenNumbers = new TreeSet(); // Using the add() method evenNumbers.add(2); evenNumbers.add(4); evenNumbers.add(6); System.out.println("TreeSet: " + evenNumbers); TreeSet numbers = new TreeSet(); numbers.add(1); // Using the addAll() method numbers.addAll(evenNumbers); System.out.println("New TreeSet: " + numbers); ) ) 

Παραγωγή

 TreeSet: (2, 4, 6) Νέο TreeSet: (1, 2, 4, 6) 

Πρόσβαση στο TreeSet Elements

Για να αποκτήσετε πρόσβαση στα στοιχεία ενός δέντρου, μπορούμε να χρησιμοποιήσουμε τη iterator()μέθοδο. Για να χρησιμοποιήσετε αυτήν τη μέθοδο, πρέπει να εισαγάγετε java.util.Iteratorπακέτο. Για παράδειγμα,

 import java.util.TreeSet; import java.util.Iterator; class Main ( public static void main(String() args) ( TreeSet numbers = new TreeSet(); numbers.add(2); numbers.add(5); numbers.add(6); System.out.println("TreeSet: " + numbers); // Calling iterator() method Iterator iterate = numbers.iterator(); System.out.print("TreeSet using Iterator: "); // Accessing elements while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) ) 

Παραγωγή

 TreeSet: (2, 5, 6) TreeSet χρησιμοποιώντας Iterator: 2, 5, 6, 

Κατάργηση στοιχείων

  • remove() - αφαιρεί το καθορισμένο στοιχείο από το σετ
  • removeAll() - αφαιρεί όλα τα στοιχεία από το σετ

Για παράδειγμα,

 import java.util.TreeSet; class Main ( public static void main(String() args) ( TreeSet numbers = new TreeSet(); numbers.add(2); numbers.add(5); numbers.add(6); System.out.println("TreeSet: " + numbers); // Using the remove() method boolean value1 = numbers.remove(5); System.out.println("Is 5 removed? " + value1); // Using the removeAll() method boolean value2 = numbers.removeAll(numbers); System.out.println("Are all elements removed? " + value2); ) ) 

Παραγωγή

TreeSet: (2, 5, 6) Καταργείται το 5; αλήθεια Καταργούνται όλα τα στοιχεία; αληθής

Μέθοδοι πλοήγησης

Δεδομένου ότι η TreeSetτάξη υλοποιείται NavigableSet, παρέχει διάφορες μεθόδους για να περιηγηθείτε στα στοιχεία του δέντρου.

1. Πρώτη () και τελευταία () Μέθοδοι

  • first() - επιστρέφει το πρώτο στοιχείο του σετ
  • last() - επιστρέφει το τελευταίο στοιχείο του σετ

Για παράδειγμα,

 import java.util.TreeSet; class Main ( public static void main(String() args) ( TreeSet numbers = new TreeSet(); numbers.add(2); numbers.add(5); numbers.add(6); System.out.println("TreeSet: " + numbers); // Using the first() method int first = numbers.first(); System.out.println("First Number: " + first); // Using the last() method int last = numbers.last(); System.out.println("Last Number: " + last); ) ) 

Παραγωγή

 TreeSet: (2, 5, 6) Πρώτος αριθμός: 2 Τελευταίος αριθμός: 6 

2. Μέθοδος οροφής (), δαπέδου (), υψηλότερου () και χαμηλότερου ()

  • υψηλότερο (στοιχείο) - Επιστρέφει το χαμηλότερο στοιχείο μεταξύ των στοιχείων που είναι μεγαλύτερα από τα καθορισμένα element.
  • χαμηλότερο (στοιχείο) - Επιστρέφει το μεγαλύτερο στοιχείο μεταξύ των στοιχείων που είναι μικρότερα από τα καθορισμένα element.
  • ανώτατο όριο (στοιχείο) - Επιστρέφει το χαμηλότερο στοιχείο μεταξύ των στοιχείων που είναι μεγαλύτερα από το καθορισμένο στοιχείο. Εάν το στοιχείο που πέρασε υπάρχει σε ένα σύνολο δέντρων, επιστρέφει το elementπέρασμα ως όρισμα.
  • δάπεδο (στοιχείο) - Επιστρέφει το μεγαλύτερο στοιχείο μεταξύ των στοιχείων που είναι μικρότερα από το καθορισμένο element. Εάν το στοιχείο που πέρασε υπάρχει σε ένα σύνολο δέντρων, επιστρέφει το elementπέρασμα ως όρισμα.

Για παράδειγμα,

 import java.util.TreeSet; class Main ( public static void main(String() args) ( TreeSet numbers = new TreeSet(); numbers.add(2); numbers.add(5); numbers.add(4); numbers.add(6); System.out.println("TreeSet: " + numbers); // Using higher() System.out.println("Using higher: " + numbers.higher(4)); // Using lower() System.out.println("Using lower: " + numbers.lower(4)); // Using ceiling() System.out.println("Using ceiling: " + numbers.ceiling(4)); // Using floor() System.out.println("Using floor: " + numbers.floor(3)); ) ) 

Παραγωγή

 TreeSet: (2, 4, 5, 6) Χρήση υψηλότερου: 5 Χρήση χαμηλότερου: 2 Χρήση οροφής: 4 Χρήση δαπέδου: 2 

3. Μέθοδοι pollfirst () και pollLast ()

  • pollFirst() - επιστρέφει και αφαιρεί το πρώτο στοιχείο από το σετ
  • pollLast() - επιστρέφει και αφαιρεί το τελευταίο στοιχείο από το σετ

Για παράδειγμα,

 import java.util.TreeSet; class Main ( public static void main(String() args) ( TreeSet numbers = new TreeSet(); numbers.add(2); numbers.add(5); numbers.add(4); numbers.add(6); System.out.println("TreeSet: " + numbers); // Using pollFirst() System.out.println("Removed First Element: " + numbers.pollFirst()); // Using pollLast() System.out.println("Removed Last Element: " + numbers.pollLast()); System.out.println("New TreeSet: " + numbers); ) ) 

Παραγωγή

 TreeSet: (2, 4, 5, 6) Removed First Element: 2 Removed Last Element: 6 New TreeSet: (4, 5) 

4. headSet(), tailSet() and subSet() Methods

headSet(element, booleanValue)

The headSet() method returns all the elements of a tree set before the specified element (which is passed as an argument).

The booleanValue parameter is optional. Its default value is false.

If true is passed as a booleanValue, the method returns all the elements before the specified element including the specified element.

For example,

 import java.util.TreeSet; class Main ( public static void main(String() args) ( TreeSet numbers = new TreeSet(); numbers.add(2); numbers.add(5); numbers.add(4); numbers.add(6); System.out.println("TreeSet: " + numbers); // Using headSet() with default boolean value System.out.println("Using headSet without boolean value: " + numbers.headSet(5)); // Using headSet() with specified boolean value System.out.println("Using headSet with boolean value: " + numbers.headSet(5, true)); ) ) 

Output

 TreeSet: (2, 4, 5, 6) Using headSet without boolean value: (2, 4) Using headSet with boolean value: (2, 4, 5) 

tailSet(element, booleanValue)

The tailSet() method returns all the elements of a tree set after the specified element (which is passed as a parameter) including the specified element.

The booleanValue parameter is optional. Its default value is true.

If false is passed as a booleanValue, the method returns all the elements after the specified element without including the specified element.

For example,

 import java.util.TreeSet; class Main ( public static void main(String() args) ( TreeSet numbers = new TreeSet(); numbers.add(2); numbers.add(5); numbers.add(4); numbers.add(6); System.out.println("TreeSet: " + numbers); // Using tailSet() with default boolean value System.out.println("Using tailSet without boolean value: " + numbers.tailSet(4)); // Using tailSet() with specified boolean value System.out.println("Using tailSet with boolean value: " + numbers.tailSet(4, false)); ) ) 

Output

 TreeSet: (2, 4, 5, 6) Using tailSet without boolean value: (4, 5, 6) Using tailSet with boolean value: (5, 6) 

subSet(e1, bv1, e2, bv2)

The subSet() method returns all the elements between e1 and e2 including e1.

The bv1 and bv2 are optional parameters. The default value of bv1 is true, and the default value of bv2 is false.

If false is passed as bv1, the method returns all the elements between e1 and e2 without including e1.

If true is passed as bv2, the method returns all the elements between e1 and e2, including e1.

For example,

 import java.util.TreeSet; class Main ( public static void main(String() args) ( TreeSet numbers = new TreeSet(); numbers.add(2); numbers.add(5); numbers.add(4); numbers.add(6); System.out.println("TreeSet: " + numbers); // Using subSet() with default boolean value System.out.println("Using subSet without boolean value: " + numbers.subSet(4, 6)); // Using subSet() with specified boolean value System.out.println("Using subSet with boolean value: " + numbers.subSet(4, false, 6, true)); ) ) 

Output

 TreeSet: (2, 4, 5, 6) Using subSet without boolean value: (4, 5) Using subSet with boolean value: (5, 6) 

Set Operations

The methods of the TreeSet class can also be used to perform various set operations.

Union of Sets

To perform the union between two sets, we use the addAll() method. For example,

 import java.util.TreeSet;; class Main ( public static void main(String() args) ( TreeSet evenNumbers = new TreeSet(); evenNumbers.add(2); evenNumbers.add(4); System.out.println("TreeSet1: " + evenNumbers); TreeSet numbers = new TreeSet(); numbers.add(1); numbers.add(2); numbers.add(3); System.out.println("TreeSet2: " + numbers); // Union of two sets numbers.addAll(evenNumbers); System.out.println("Union is: " + numbers); ) ) 

Output

 TreeSet1: (2, 4) TreeSet2: (1, 2, 3) Union is: (1, 2, 3, 4) 

Intersection of Sets

To perform the intersection between two sets, we use the retainAll() method. For example,

 import java.util.TreeSet;; class Main ( public static void main(String() args) ( TreeSet evenNumbers = new TreeSet(); evenNumbers.add(2); evenNumbers.add(4); System.out.println("TreeSet1: " + evenNumbers); TreeSet numbers = new TreeSet(); numbers.add(1); numbers.add(2); numbers.add(3); System.out.println("TreeSet2: " + numbers); // Intersection of two sets numbers.retainAll(evenNumbers); System.out.println("Intersection is: " + numbers); ) ) 

Output

 TreeSet1: (2, 4) TreeSet2: (1, 2, 3) Intersection is: (2) 

Difference of Sets

To calculate the difference between the two sets, we can use the removeAll() method. For example,

 import java.util.TreeSet;; class Main ( public static void main(String() args) ( TreeSet evenNumbers = new TreeSet(); evenNumbers.add(2); evenNumbers.add(4); System.out.println("TreeSet1: " + evenNumbers); TreeSet numbers = new TreeSet(); numbers.add(1); numbers.add(2); numbers.add(3); numbers.add(4); System.out.println("TreeSet2: " + numbers); // Difference between two sets numbers.removeAll(evenNumbers); System.out.println("Difference is: " + numbers); ) ) 

Output

 TreeSet1: (2, 4) TreeSet2: (1, 2, 3, 4) Difference is: (1, 3) 

Subset of a Set

To check if a set is a subset of another set or not, we use the containsAll() method. For example,

 import java.util.TreeSet; class Main ( public static void main(String() args) ( TreeSet numbers = new TreeSet(); numbers.add(1); numbers.add(2); numbers.add(3); numbers.add(4); System.out.println("TreeSet1: " + numbers); TreeSet primeNumbers = new TreeSet(); primeNumbers.add(2); primeNumbers.add(3); System.out.println("TreeSet2: " + primeNumbers); // Check if primeNumbers is subset of numbers boolean result = numbers.containsAll(primeNumbers); System.out.println("Is TreeSet2 subset of TreeSet1? " + result); ) ) 

Output

 TreeSet1: (1, 2, 3, 4) TreeSet2: (2, 3) Is TreeSet2 subset of TreeSet1? True 

Other Methods of TreeSet

Method Description
clone() Creates a copy of the TreeSet
contains() Searches the TreeSet for the specified element and returns a boolean result
isEmpty() Checks if the TreeSet is empty
size() Returns the size of the TreeSet
clear() Removes all the elements from the TreeSet

To learn more, visit Java TreeSet (official Java documentation).

TreeSet Vs. HashSet

Both the TreeSet as well as the HashSet implements the Set interface. However, there exist some differences between them.

  • Unlike HashSet, elements in TreeSet are stored in some order. It is because TreeSet implements the SortedSet interface as well.
  • TreeSet provides some methods for easy navigation. For example, first(), last(), headSet(), tailSet(), etc. It is because TreeSet also implements the NavigableSet interface.
  • HashSet is faster than the TreeSet for basic operations like add, remove, contains and size.

TreeSet Comparator

In all the examples above, tree set elements are sorted naturally. However, we can also customize the ordering of elements.

For this, we need to create our own comparator class based on which elements in a tree set are sorted. For example,

 import java.util.TreeSet; import java.util.Comparator; class Main ( public static void main(String() args) ( // Creating a tree set with customized comparator TreeSet animals = new TreeSet(new CustomComparator()); animals.add("Dog"); animals.add("Zebra"); animals.add("Cat"); animals.add("Horse"); System.out.println("TreeSet: " + animals); ) // Creating a comparator class public static class CustomComparator implements Comparator ( @Override public int compare(String animal1, String animal2) ( int value = animal1.compareTo(animal2); // elements are sorted in reverse order if (value> 0) ( return -1; ) else if (value < 0) ( return 1; ) else ( return 0; ) ) ) ) 

Output

 TreeSet: (Zebra, Horse, Dog, Cat) 

In the above example, we have created a tree set passing CustomComparator class as an argument.

Η κλάση CustomComparator εφαρμόζει τη Comparatorδιεπαφή.

Στη συνέχεια παρακάμπτουμε τη compare()μέθοδο. Η μέθοδος θα ταξινομήσει τώρα στοιχεία με αντίστροφη σειρά.

Για να μάθετε περισσότερα, επισκεφθείτε το Java Comparator (επίσημη τεκμηρίωση Java).

ενδιαφέροντα άρθρα...