Có thể tạo ArrayList của các giá trị enum (và điều khiển nó) không? Ví dụ:Danh sách các giá trị enum trong java
enum MyEnum
{
ONE, TWO
}
MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);
Có thể tạo ArrayList của các giá trị enum (và điều khiển nó) không? Ví dụ:Danh sách các giá trị enum trong java
enum MyEnum
{
ONE, TWO
}
MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);
Có nó chắc chắn là có thể, nhưng bạn sẽ phải làm
List<MyEnum> al = new ArrayList<MyEnum>();
Sau đó bạn có thể thêm các yếu tố để al
: al.add(ONE)
hoặc al.add(TWO)
.
Một enum chỉ là một lớp khác trong Java, nên có thể.
Chính xác hơn, một enum là một thể hiện của đối tượng: http://docs.oracle.com/javase/6/docs/api/java/lang/Enum.html
Vì vậy, vâng, nó sẽ làm việc.
Có thể nhưng bạn nên sử dụng EnumSet
thay
enum MyEnum {
ONE, TWO;
public static final EnumSet<MyEnum> all = EnumSet.of(ONE, TWO);
}
Bạn có thể chỉ đơn giản là viết
new ArrayList<MyEnum>(Arrays.asList(MyEnum.values()));
Ai đó giải thích tại sao đây không phải là "câu trả lời được chọn"? – Debriter
Bởi vì câu trả lời được chọn là tốt như tôi đoán. –
Đây là một giải pháp chung chung hơn, có thể được sử dụng cho bất kỳ đối tượng Enum, vì vậy hãy miễn phí sử dụng.
static public List<Object> constFromEnumToList(Class enumType) {
List<Object> nueva = new ArrayList<Object>();
if (enumType.isEnum()) {
try {
Class<?> cls = Class.forName(enumType.getCanonicalName());
Object[] consts = cls.getEnumConstants();
nueva.addAll(Arrays.asList(consts));
} catch (ClassNotFoundException e) {
System.out.println("No se localizo la clase");
}
}
return nueva;
}
Bây giờ bạn phải gọi theo cách này:
constFromEnumToList(MiEnum.class);
Điều này cực kỳ phức tạp và không cung cấp bất kỳ sự bảo vệ kiểu nào (một phần lý do loại 'enum' được thêm vào Java). – squid314
Tôi nghĩ enum.values () là một cách tiếp cận dễ dàng hơn nhiều để có được một Bộ sưu tập các enums của bạn. –
The Answer (EnumSet
) bởi Amit Deshpande và the Answer (.values
) bởi Marko Topolnik đều đúng. Đây là một chút thông tin.
Phương pháp .values()
là một phương pháp được khai báo ngầm được hiển thị trên Enum
, được trình biên dịch thêm vào. Nó tạo ra một mảng thô thay vì một số Collection
. Chắc chắn có thể sử dụng được.
lưu ý đặc biệt về tài liệu: Là bất thường như một phương pháp ngầm tuyên bố, phương pháp .values()
là không liệt kê trong số các phương pháp trên lớp Enum
. Phương thức là defined in the Java Language Specification và được đề cập trong tài liệu cho Enum.valueOf
.
Các mặt tích cực để EnumSet
bao gồm:
Để báo lớp doc:
bộ Enum được đại diện trong nội bộ như vectơ bit. Biểu diễn này cực kỳ nhỏ gọn và hiệu quả. Hiệu suất không gian và thời gian của lớp này nên đủ tốt để cho phép sử dụng nó như là một sự thay thế an toàn, chất lượng cao cho các cờ bit "int" truyền thống."Các hoạt động Ngay cả với số lượng lớn (ví dụ như containsAll và retainAll) nên chạy rất nhanh nếu lập luận của họ cũng là một bộ enum
Với enum này:..
enum Animal
{
DOG , CAT , BIRD , BAT ;
}
Thực hiện một EnumSet
trong một dòng
EnumSet<Animal> allAnimals = EnumSet.allOf(Animal.class);
Dump để an ủi.
System.out.println("allAnimals : " + allAnimals);
allAnimals: [DOG, CAT, BIRD, BAT]
Tạo một bộ từ một tập hợp con của các đối tượng enum.
EnumSet<Animal> flyingAnimals = EnumSet.of(BIRD , BAT);
Xem the class doc để xem nhiều cách thao tác thu thập bao gồm thêm hoặc xóa phần tử.
EnumSet<Animal> featheredFlyingAnimals =
EnumSet.copyOf(flyingAnimals).remove(BAT);
Các doc hứa hẹn Iterator cho EnumSet là trong trật tự tự nhiên, thứ tự trong đó các giá trị của enum được công bố ban đầu.
Để báo lớp doc:
Các iterator được trả về bởi phương pháp lặp đi qua các yếu tố trong trật tự tự nhiên của họ (thứ tự mà các hằng enum được khai báo).
Thành thật mà nói, với lời hứa này, tôi nhầm lẫn vì sao đây không phải là SortedSet
. Nhưng, tốt thôi, đủ tốt. Chúng tôi có thể tạo một List
từ Set
nếu muốn. Chuyển bất kỳ số Collection
nào tới hàm tạo của ArrayList
và số Iterator
của bộ sưu tập đó được tự động gọi thay cho bạn.
List<Animal> list = new ArrayList<>(allAnimals);
Dump to console.
System.out.println("list : " + list);
Khi chạy.
list : [DOG, CAT, BIRD, BAT]
Thông tin chi tiết tuyệt vời trong câu trả lời này! – Alfabravo
Điều này trả về danh sách trống cho tôi. –
@BasilBourque Nó phụ thuộc vào việc giải thích câu hỏi. Tôi đã chỉnh sửa rõ ràng. – arshajii