Enumset trong Java

0 phút đọc

EnumSet trong Java là gì?

Class EnumSet của collections framework trong Java triển khai tập hợp các phần tử của một enum đơn. Trước khi bạn tìm hiểu về EnumSet, hãy chắc chắn rằng bạn đã biết về Enums trong Java.

EnumSet giúp ta lưu trữ các giá trị enum một cách hiệu quả so các set khác (như HashSet, TreeSet).

Một EnumSet chỉ lưu trữ các giá trị enum của một enum cụ thể. Do đó, JVM sẽ biết tất cả các giá trị có thể có của set. Đây là lý do tại sao các EnumSet được triển khai nội bộ như một chuỗi các bit. Các bit xác định xem các phần tử có trong EnumSet hay không.

EnumSet trong Java

Tạo EnumSet trong Java

Để tạo một EnumSet, trước tiên chúng ta phải import gói java.util.EnumSet. Khác với việc triển khai set, EnumSet không có các constructor công khai. Chúng ta phải sử dụng các hàm được xác định trước để tạo ra một EnumSet.

Sử dụng hàm allOf(Size)

Hàm allof() tạo ra một EnumSet có chứa tất cả các giá trị của enum kiểu Size đã chỉ định.

import java.util.EnumSet;

class Main {
    // an enum named Size
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRA_LARGE
    }

    public static void main(String[] args) {
        // Creating an EnumSet using allOf()
        EnumSet<Size> sizes = EnumSet.allOf(Size.class);
        System.out.println("EnumSet: " + sizes);
    }

}

Kết quả

EnumSet: [SMALL, MEDIUM, LARGE, EXTRA_LARGE]

Lưu ý câu lệnh

EnumSet<Size> sizes = EnumSet.allOf(Size.class);

Ở đây, Size.Class biểu diễn enum có tên Size mà chúng ta đã tạo ra.

Sử dụng noneOf(Size)

Hàm noneOf() tạo ra một EnumSet trống.

import java.util.EnumSet;

class Main {

     // an enum type Size
    enum Size {
        SMALL, MEDIUM, LARGE, EXTRA_LARGE
    }

    public static void main(String[] args) {

        // Creating an EnumSet using noneOf()
        EnumSet<Size> sizes = EnumSet.noneOf(Size.class);

        System.out.println("Empty EnumSet: " + sizes);
    }
}

Kết quả

Empty EnumSet : []

Ở đây, chúng ta đã tạo ra một enum trống có tên là Size. Lưu ý chúng ta chỉ có thể chèn các phần tử của kiểu enum Size trong chương trình trên. Bởi vì chúng ta đã tạo ra EnumSet trống bằng cách sử dụng enum Size.

Sử dụng hàm range(e1, e2)

Hàm range() tạo ra một EnumSet chứa tất cả các giá trị của một enum giữa 2 giá trị e1e2 bao gồm cả hai giá trị này.

import java.util.EnumSet;

class Main {

    enum Size {
        SMALL, MEDIUM, LARGE, EXTRA_LARGE
    }

    public static void main(String[] args) {

        // Creating an EnumSet using range()
        EnumSet<Size> sizes = EnumSet.range(Size.MEDIUM, Size.EXTRA_LARGE);

        System.out.println("EnumSet: " + sizes);
    }
}

Kết quả

EnumSet: [MEDIUM, LARGE, EXTRA_LARGE]

Sử dụng hàm of()

Hàm of() tạo ra một EnumSet có chứa các phần tử đã chỉ định.

import java.util.EnumSet;

class Main {

    enum Size {
        SMALL, MEDIUM, LARGE, EXTRA_LARGE
    }

    public static void main(String[] args) {

        // Using of() with a single parameter
        EnumSet<Size> sizes1 = EnumSet.of(Size.MEDIUM);
        System.out.println("EnumSet1: " + sizes1);

        EnumSet<Size> sizes2 = EnumSet.of(Size.SMALL, Size.LARGE);
        System.out.println("EnumSet2: " + sizes2);
    }
}

Kết quả

EnumSet1: [MEDIUM]
EnumSet2: [SMALL, LARGE]

Chèn các phần tử vào EnumSet trong Java

  • add() – chèn các giá trị enum được chỉ định vào EnumSet
  • addAll() chèn tất cả các phần tử của collection đã chỉ định vào set
import java.util.EnumSet;

class Main {

    enum Size {
        SMALL, MEDIUM, LARGE, EXTRA_LARGE
    }

    public static void main(String[] args) {

        // Creating an EnumSet using allOf()
        EnumSet<Size> sizes1 = EnumSet.allOf(Size.class);

        // Creating an EnumSet using noneOf()
        EnumSet<Size> sizes2 = EnumSet.noneOf(Size.class);

        // Using add method
        sizes2.add(Size.MEDIUM);
        System.out.println("EnumSet Using add(): " + sizes2);

        // Using addAll() method
        sizes2.addAll(sizes1);
        System.out.println("EnumSet Using addAll(): " + sizes2);
    }
}

Kết quả

EnumSet using add(): [MEDIUM]
EnumSet using addAll(): [SMALL, MEDIUM, LARGE, EXTRA_LARGE]

Trong ví dụ trên, chúng ta đã sử dụng hàm addAll() để chèn tất cả các phần tử của EnumSet Size1 đến EnumSet Size2. Ta cũng có thể chèn các phần tử từ các collection khác như ArrayList, LinkedList,... để một EnumSetbằng cách sử dụng hàmaddAll(). Tuy nhiên, tất cả các collectionnên thuộc cùng loạienum`.

Truy cập các phần tử của EnumSet

Để truy cập các phần tử của EnumSet, chúng ta có thể sử dụng hàm iterator(). Để sử dụng hàm này, chúng ta phải import gói java.util.Iterator.

import java.util.EnumSet;
import java.util.Iterator;

class Main {

    enum Size {
        SMALL, MEDIUM, LARGE, EXTRA_LARGE
    }

    public static void main(String[] args) {

        // Creating an EnumSet using allOf()
        EnumSet<Size> sizes = EnumSet.allOf(Size.class);

        Iterator<Size> iterate = sizes.iterator();

        System.out.print("EnumSet: ");
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

Kết quả

EnumSet: SMALL, MEDIUM, LARGE, EXTRA_LARGE,

Lưu ý:

  • hasNext() trả về true nếu có phần tử tiếp theo trong EnumSet
  • next() trả về phần tử tiếp theo trong EnumSet

Xóa bỏ các phần tử khỏi EnumSet

  • remove() – xóa phần tử đã chỉ định khỏi EnumSet
  • removeAll() – loại bỏ tất cả các phần tử khỏi EnumSet
import java.util.EnumSet;

class Main {

    enum Size {
        SMALL, MEDIUM, LARGE, EXTRA_LARGE
    }

    public static void main(String[] args) {

        // Creating EnumSet using allOf()
        EnumSet<Size> sizes = EnumSet.allOf(Size.class);
        System.out.println("EnumSet: " + sizes);

        // Using remove()
        boolean value1 = sizes.remove(Size.MEDIUM);
        System.out.println("Is MEDIUM removed? " + value1);

        // Using removeAll()
        boolean value2 = sizes.removeAll(sizes);
        System.out.println("Are all elements removed? " + value2);
    }
}

Kết quả

EnumSet: [SMALL, MEDIUM, LARGE, EXTRA_LARGE]
Is MEDIUM removed? true
Are all elements removed? true

Một số hàm trong EnumSet

Hàm Mô tả
copyOf() Tạo một bản sao của EnumSet
contains() Tìm kiếm phần tử đã chỉ định trong EnumSet và trả về kết quả boolean
isEmpty() Kiểm tra xem EnumSet có trống hay không
size() Trả về kích thước của EnumSet
clear() Loại bỏ tất cả các phần tử khỏi EnumSet

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào

Avatar TechMely Team
Được viết bởi

TechMely Team

Đôi khi, không cẩn thận biết một số chuyện, mới phát hiện ra rằng những điều bản thân để tâm lại nực cười đến thế.