2012-10-28 41 views
33

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); 

Trả lời

17

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

+1

Điều này trả về danh sách trống cho tôi. –

+0

@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

10

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); 
} 
+4

Tại sao nên sử dụng 'EnumSet'? Điều gì xảy ra nếu OP muốn có một danh sách có thứ tự? – arshajii

+0

Vâng, hãy thử EnumSet, nhưng chỉ tò mò về ArrayList. – Alf

+3

@ A.R.S. Các phần tử trong 'EnumSet' theo thứ tự tự nhiên. Kiểm tra java doc –

88

Bạn có thể chỉ đơn giản là viết

new ArrayList<MyEnum>(Arrays.asList(MyEnum.values())); 
+1

Ai đó giải thích tại sao đây không phải là "câu trả lời được chọn"? – Debriter

+0

Bởi vì câu trả lời được chọn là tốt như tôi đoán. –

2

Đâ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); 
+1

Đ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

+1

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

10

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

nhanh & nhỏ

Các mặt tích cực để EnumSet bao gồm:

  • tốc độ cực.
  • Sử dụng bộ nhớ nhỏ gọn.

Để 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); 

thứ tự tự nhiên

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] 
+0

Thông tin chi tiết tuyệt vời trong câu trả lời này! – Alfabravo

Các vấn đề liên quan