Java TreeSet

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 TreeSetlớ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.TreeSettrướ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 TreeSettrong Java.


TreeSet<Integer> numbers = new TreeSet<>();

Ở đây, chúng tôi đã tạo một TreeSetmà 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 Comparatorgiao 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 TreeSetlớ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 set
  • addAll() – 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.Iteratorgó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 set
  • removeAll() – 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

Kể từ khi TreeSetlớ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 set
  • last() – 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 the element 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 set
  • pollLast() – 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à truevà 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 TreeSetlớ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

MethodDecfscription
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 TreeSetcũng như HashSettriển khai Setgiao diện. Tuy nhiên, tồn tại một số khác biệt giữa chúng.

  • 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.

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 Comparatorgiao 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) .









Gõ tìm kiếm nhanh...