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<Integer> numbers = new TreeSet<>();
Ở đây, chúng tôi đã tạo 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ó ở phầ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()
– inserts the specified element to the setaddAll()
– inserts all the elements of the specified collection to the set
Ví dụ,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
// Using the add() method
evenNumbers.add(2);
evenNumbers.add(4);
evenNumbers.add(6);
System.out.println("TreeSet: " + evenNumbers);
TreeSet<Integer> 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] New TreeSet: [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 thức. Để 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<Integer> numbers = new TreeSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("TreeSet: " + numbers);
// Calling iterator() method
Iterator<Integer> 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 using Iterator: 2, 5, 6,
Xóa các phần tử
remove()
– removes the specified element from the setremoveAll()
– removes all the elements from the set
Ví dụ,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> 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] Is 5 removed? true Are all elements removed? true
Phương pháp điều hướng
Kể từ khi 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 hợp cây.
1. Phương thức đầu tiên () và cuối cùng ()
first()
– returns the first element of the setlast()
– returns the last element of the set
Ví dụ,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> 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] First Number: 2 Last Number: 6
2. Phương thức trần (), sàn (), cao hơn () và thấp hơn ()
- higher(element) – Returns the lowest element among those elements that are greater than the specified
element
. - lower(element) – Returns the greatest element among those elements that are less than the specified
element
. - ceiling(element) – Returns the lowest element among those elements that are greater than the specified element. If the element passed exists in a tree set, it returns the
element
passed as an argument. - floor(element) – Returns the greatest element among those elements that are less than the specified
element
. If the element passed exists in a tree set, it returns theelement
passed as an argument.
Ví dụ,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> 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] Using higher: 5 Using lower: 2 Using ceiling: 4 Using floor: 2
3. Phương thức thăm dò ý kiến () và thăm dò ý kiến ()
pollFirst()
– returns and removes the first element from the setpollLast()
– returns and removes the last element from the set
Ví dụ,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> 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] Removed First Element: 2 Removed Last Element: 6 New TreeSet: [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 xác định yếu tố (được thông qua như là một cuộc tranh cãi).
Các booleanValue tham số 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<Integer> 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] Using headSet without boolean value: [2, 4] Using headSet with boolean value: [2, 4, 5]
tailSet (phần tử, booleanValue)
Các tailSet()
phương pháp trả về tất cả các yếu tố của một bộ cây sau khi xác định yếu tố (được thông qua như là một tham số), bao gồm các quy định yếu tố .
Các booleanValue tham số là tùy chọn. Giá trị mặc định của nó là true
.
Nếu false
được truyền dưới dạng booleanValue , phương thức trả về tất cả các phần tử sau phần tử được chỉ định mà không bao gồm phần tử đã chỉ định .
Ví dụ,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> 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));
}
}
Đầu ra
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)
Các subSet()
phương pháp trả về tất cả các yếu tố giữa e1 và e2 bao gồm e1 .
Các BV1 và bv2 là các thông số tùy chọn. Giá trị mặc định của bv1 là true
và giá trị mặc định của bv2 là false
.
Nếu false
được chuyển dưới dạng bv1 , phương thức trả về tất cả các phần tử giữa e1 và e2 mà không bao gồm e1
.
Nếu true
được chuyển dưới dạng bv2 , phương thức trả về tất cả các phần tử giữa e1 và e2 , bao gồm cả e1 .
Ví dụ,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> 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));
}
}
Đầu ra
TreeSet: [2, 4, 5, 6] Using subSet without boolean value: [4, 5] Using subSet with boolean value: [5, 6]
Đặt hoạt động
Các phương thức của TreeSet
lớp cũng có thể được sử dụng để thực hiện các hoạt động tập hợp khác nhau.
Liên hiệp các bộ
Để thực hiện kết hợp giữa hai tập hợp, chúng tôi sử dụng addAll()
phương pháp. Ví dụ,
import java.util.TreeSet;;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("TreeSet1: " + evenNumbers);
TreeSet<Integer> 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);
}
}
Đầu ra
TreeSet1: [2, 4] TreeSet2: [1, 2, 3] Union is: [1, 2, 3, 4]
Giao điểm của Bộ
Để thực hiện giao giữa hai tập hợp, ta sử dụng retainAll()
phương pháp. Ví dụ,
import java.util.TreeSet;;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("TreeSet1: " + evenNumbers);
TreeSet<Integer> 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);
}
}
Đầu ra
TreeSet1: [2, 4] TreeSet2: [1, 2, 3] Intersection is: [2]
Sự khác biệt của các bộ
Để tính toán sự khác biệt giữa hai tập hợp, chúng ta có thể sử dụng removeAll()
phương pháp. Ví dụ,
import java.util.TreeSet;;
class Main {
public static void main(String[] args) {
TreeSet<Integer> evenNumbers = new TreeSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("TreeSet1: " + evenNumbers);
TreeSet<Integer> 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);
}
}
Đầu ra
TreeSet1: [2, 4] TreeSet2: [1, 2, 3, 4] Difference is: [1, 3]
Tập hợp con của một Tập hợp
Để kiểm tra xem một tập hợp có phải là tập hợp con của tập hợp khác hay không, chúng ta sử dụng containsAll()
phương pháp. Ví dụ,
import java.util.TreeSet;
class Main {
public static void main(String[] args) {
TreeSet<Integer> numbers = new TreeSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
System.out.println("TreeSet1: " + numbers);
TreeSet<Integer> 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);
}
}
Đầu ra
TreeSet1: [1, 2, 3, 4] TreeSet2: [2, 3] Is TreeSet2 subset of TreeSet1? True
Các phương pháp khác của TreeSet
Method | Decfscription |
---|---|
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 |
Để tìm hiểu thêm, hãy truy cập Java TreeSet (tài liệu Java chính thức) .
TreeSet Vs. HashSet
Cả hai TreeSet
cũng như HashSet
triển khai Set
giao diện. Tuy nhiên, tồn tại một số khác biệt giữa chúng.
- 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.
Bộ so sánh TreeSet
Trong tất cả các ví dụ trên, các phần tử tập hợp cây được sắp xếp tự nhiên. Tuy nhiên, chúng tôi cũng có thể tùy chỉnh thứ tự của các phần tử.
Đối với điều này, chúng ta cần tạo lớp so sánh của riêng mình dựa trên các phần tử trong một tập hợp cây được sắp xếp. Ví dụ,
import java.util.TreeSet;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
// Creating a tree set with customized comparator
TreeSet<String> 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<String> {
@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;
}
}
}
}
Đầu ra
TreeSet: [Zebra, Horse, Dog, Cat]
Trong ví dụ trên, chúng ta đã tạo một tập hợp cây truyền lớp CustomComparator làm đối số.
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) .