Điền vào một danh sách với tất cả các giá trị enum trong Java


80

Tôi muốn điền vào một danh sách với tất cả các giá trị có thể có của một enum
Vì gần đây tôi đã yêu EnumSet, tôi đã tận dụngallOf()

EnumSet<Something> all = EnumSet.allOf( Something.class);
List<Something> list = new ArrayList<>( all.size());
for (Something s : all) {
    list.add( s);
}
return list;

Có cách nào tốt hơn (như trong một lớp lót không bị xáo trộn) để đạt được kết quả tương tự?


ArrayList <Something> list = ArrayList mới <Something> (Arrays.asList (Something.values ()))
TacB0sS

Câu trả lời:


169

Tôi sẽ không sử dụng Danh sách ở những nơi đầu tiên vì EnumSet dễ chấp thuận hơn nhưng bạn có thể làm

List<Something> somethingList = Arrays.asList(Something.values());

hoặc là

List<Something> somethingList =
                 new ArrayList<Something>(EnumSet.allOf(Something.class));

3
Đôi khi EnumSet không cắt nó. Đặc biệt khi đơn đặt hàng có vấn đề
MonoThreaded

1
@MonoThreaded Bạn đã nghĩ đến thứ tự nào? Một EnumSet là theo thứ tự tự nhiên cho một enum. Danh sách sẽ theo thứ tự như tập hợp, vì vậy việc sử dụng Danh sách không thay đổi bất cứ điều gì ở đây.
Peter Lawrey

1
Xin lỗi, đặt hàng nằm ngoài phạm vi cho câu hỏi này. Tôi tin rằng bạn muốn nói đến giá trị () trong ví dụ đầu tiên.
MonoThreaded

@PeterLawrey chúng tôi sử dụng Enums mọi lúc. Khi chúng tôi thiết kế một quy trình làm việc, quy trình phê duyệt có thể không di chuyển trong Natural OrderEnum, đây là lý do tại sao a List<Enum>có ích so với an EnumSet.
buzzsawddog


10

Có một phương thức ArrayListkhởi tạo là

ArrayList(Collection<? extends E> c) 

Bây giờ, hãy EnumSetmở rộng AbstractCollectionđể bạn có thể làm

ArrayList<Something> all = new ArrayList<Something>(enumSet)

8

thử

enum E {
    E1, E2, E3
}

public static void main(String[] args) throws Exception {
    List<E> list = Arrays.asList(E.values());
    System.out.println(list);
}

Bố cục xấu nhưng cách tiếp cận tốt :)
MonoThreaded

đáng làm rõ rằng bạn không nhận được một java.util.ArrayList ra điều này, như đã nêu trong câu hỏi
planetjones

@MonoThreaded làm thế nào nó là xấu xí? bạn sẽ có được những gì bạn yêu cầu
CA Arefe

1
List<Something> result = new ArrayList<Something>(all);

EnumSetlà một Bộ sưu tập Java, vì nó triển khai Setgiao diện:

public interface Set<E> extends Collection<E> 

Vì vậy, bất cứ điều gì bạn có thể làm với Bộ sưu tập mà bạn có thể làm với EnumSet.


0

Điều này dễ đọc hơn một chút:

Object[] allValues = all.getDeclaringClass().getEnumConstants();

1
Sau đó, bạn có thể đơn giản làm Something.class.getEnumConstants()đúng không?
shyam

1
... haySomething.values();
Peter Lawrey

0

Thử cái này:

... = new ArrayList<Something>(EnumSet.allOf(Something.class));

như ArrayListcó một hàm tạo với Collection<? extends E>. Nhưng chỉ sử dụng phương pháp này nếu bạn thực sự muốn sử dụng EnumSet.

Tất cả các enum đều có quyền truy cập vào phương thức values(). Nó trả về một mảng tất cả các giá trị enum:

... = Arrays.asList(Something.values());


-2
private ComboBox gender;
private enum Selgender{Male,Famle};
ObservableList<Object> observableList  =FXCollections.observableArrayList(Selgender.values());
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.