Trong hướng dẫn này, chúng ta sẽ tìm hiểu về lớp Java TreeSet và các hoạt động và phương thức khác nhau của nó với sự trợ giúp của các ví dụ.
Các TreeSet
lớp học của khuôn khổ bộ sưu tập Java cung cấp các chức năng của một cấu trúc dữ liệu cây.
Nó mở rộng giao diện NavigableSet.
Tạo TreeSet
Để tạo một tập hợp cây, java.util.TreeSet
trước tiên chúng ta phải nhập gói.
Sau khi chúng tôi nhập gói, đây là cách chúng tôi có thể tạo một TreeSet
trong Java.
TreeSet numbers = new TreeSet();
Ở đây, chúng tôi đã tạo ra một TreeSet
mà không có bất kỳ đối số nào. Trong trường hợp này, các phần tử trong TreeSet
được sắp xếp tự nhiên (thứ tự tăng dần).
Tuy nhiên, chúng ta có thể tùy chỉnh việc sắp xếp các phần tử bằng cách sử dụng Comparator
giao diện. Chúng ta sẽ tìm hiểu về nó sau trong hướng dẫn này.
Phương thức của TreeSet
Các TreeSet
lớp học cung cấp phương pháp khác nhau mà cho phép chúng tôi thực hiện các hoạt động khác nhau trên phim trường.
Chèn các phần tử vào TreeSet
add()
- chèn phần tử được chỉ định vào tập hợpaddAll()
- chèn tất cả các phần tử của tập hợp được chỉ định vào tập hợp
Ví dụ,
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); ) )
Đầu ra
TreeSet: (2, 4, 6) TreeSet mới: (1, 2, 4, 6)
Truy cập các phần tử TreeSet
Để truy cập các phần tử của một tập cây, chúng ta có thể sử dụng iterator()
phương pháp. Để sử dụng phương pháp này, chúng ta phải nhập java.util.Iterator
gói. Ví dụ,
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(", "); ) ) )
Đầu ra
TreeSet: (2, 5, 6) TreeSet sử dụng Iterator: 2, 5, 6,
Xóa các phần tử
remove()
- xóa phần tử được chỉ định khỏi tập hợpremoveAll()
- xóa tất cả các phần tử khỏi tập hợp
Ví dụ,
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); ) )
Đầu ra
TreeSet: (2, 5, 6) 5 có bị loại bỏ không? true Tất cả các phần tử có bị loại bỏ không? thật
Phương pháp điều hướng
Vì TreeSet
lớp thực thi NavigableSet
, nó cung cấp các phương thức khác nhau để điều hướng qua các phần tử của tập cây.
1. phương thức first () và last ()
first()
- trả về phần tử đầu tiên của tập hợplast()
- trả về phần tử cuối cùng của tập hợp
Ví dụ,
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); ) )
Đầu ra
TreeSet: (2, 5, 6) Số đầu tiên: 2 Số cuối cùng: 6
2. Phương thức trần (), sàn (), cao hơn () và thấp hơn ()
- cao hơn (phần tử) - Trả về phần tử thấp nhất trong số các phần tử lớn hơn giá trị được chỉ định
element
. - low (phần tử) - Trả về phần tử lớn nhất trong số các phần tử nhỏ hơn giá trị được chỉ định
element
. - trần (phần tử) - Trả về phần tử thấp nhất trong số các phần tử lớn hơn phần tử được chỉ định. Nếu phần tử được truyền tồn tại trong một tập hợp cây, nó sẽ trả về phần tử
element
được truyền dưới dạng một đối số. - tầng (phần tử) - Trả về phần tử lớn nhất trong số các phần tử nhỏ hơn giá trị được chỉ định
element
. Nếu phần tử được truyền tồn tại trong một tập hợp cây, nó sẽ trả về phần tửelement
được truyền dưới dạng một đối số.
Ví dụ,
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)); ) )
Đầu ra
TreeSet: (2, 4, 5, 6) Sử dụng cao hơn: 5 Sử dụng thấp hơn: 2 Sử dụng trần: 4 Sử dụng sàn: 2
3. Phương thức thăm dò ý kiến () và thăm dò ý kiến ()
pollFirst()
- trả về và xóa phần tử đầu tiên khỏi tập hợppollLast()
- trả về và xóa phần tử cuối cùng khỏi tập hợp
Ví dụ,
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); ) )
Đầu ra
TreeSet: (2, 4, 5, 6) Đã loại bỏ phần tử đầu tiên: 2 phần tử cuối cùng bị loại bỏ: 6 bộ cây mới: (4, 5)
4. Phương thức headSet (), tailSet () và subSet ()
headSet (phần tử, booleanValue)
Các headSet()
phương pháp trả về tất cả các yếu tố của một bộ cây trước khi các yếu tố cụ thể (được thông qua như là một cuộc tranh cãi).
Tham số booleanValue là tùy chọn. Giá trị mặc định của nó là false
.
Nếu true
được truyền dưới dạng booleanValue, phương thức trả về tất cả các phần tử trước phần tử được chỉ định bao gồm cả phần tử được chỉ định.
Ví dụ,
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)); ) )
Đầu ra
TreeSet: (2, 4, 5, 6) Sử dụng headSet không có giá trị boolean: (2, 4) Sử dụng headSet với giá trị boolean: (2, 4, 5)
tailSet (phần tử, 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 inTreeSet
are stored in some order. It is becauseTreeSet
implements theSortedSet
interface as well. TreeSet
provides some methods for easy navigation. For example,first()
,last()
,headSet(
),tailSet()
, etc. It is becauseTreeSet
also implements theNavigableSet
interface.HashSet
is faster than theTreeSet
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.
Lớp CustomComparator thực hiện Comparator
giao diện.
Sau đó, chúng tôi ghi đè compare()
phương thức. Phương thức bây giờ sẽ sắp xếp các phần tử theo thứ tự ngược lại.
Để tìm hiểu thêm, hãy truy cập Trình so sánh Java (tài liệu Java chính thức).