Wypełnianie listy wszystkimi wartościami wyliczenia w Javie

80

Chciałbym wypełnić listę wszystkimi możliwymi wartościami wyliczenia
Odkąd niedawno się zakochałem EnumSet, wykorzystałemallOf()

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

Czy jest lepszy sposób (jak w przypadku nie zaciemnionej wkładki), aby osiągnąć ten sam wynik?

Mono Threaded
źródło
ArrayList <Something> list = new ArrayList <Coś> (Arrays.asList (Something.values ​​()))
TacB0sS

Odpowiedzi:

169

Nie użyłbym listy w pierwszej kolejności, ponieważ EnumSet jest bardziej odpowiedni, ale możesz to zrobić

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

lub

List<Something> somethingList =
                 new ArrayList<Something>(EnumSet.allOf(Something.class));
Peter Lawrey
źródło
3
Czasami EnumSet tego nie robi. W szczególności, gdy
liczy się
1
@MonoThreaded Jakie zamówienie miałeś na myśli? EnumSet jest w naturalnej kolejności dla wyliczenia. Lista będzie w tej samej kolejności co zestaw, więc użycie Listy niczego tutaj nie zmienia.
Peter Lawrey
1
Przepraszamy, zamówienie jest poza zakresem tego pytania. Myślę, że w pierwszym przykładzie miałeś na myśli wartości ().
MonoThreaded
@PeterLawrey cały czas używamy Enums. Kiedy projektujemy przepływ pracy, proces zatwierdzania może nie poruszać się w Natural OrderEnum, dlatego List<Enum>przydaje się plik EnumSet.
buzzsawddog
EnumSetnie ma get()metody (łatwy dostęp losowy), a Listnie. Może to być ważne dla wszystkiego, do czego List / EnumSet jest przeznaczony
pallgeuer
12

Class.getEnumConstants()

List<SOME_ENUM> enumList = Arrays.asList(SOME_ENUM.class.getEnumConstants());
AZ_
źródło
10

Jest konstruktor, dla ArrayListktórego jest

ArrayList(Collection<? extends E> c) 

Teraz EnumSetrozszerza się, AbstractCollectionwięc możesz to zrobić

ArrayList<Something> all = new ArrayList<Something>(enumSet)
Jacek
źródło
8

próbować

enum E {
    E1, E2, E3
}

public static void main(String[] args) throws Exception {
    List<E> list = Arrays.asList(E.values());
    System.out.println(list);
}
Evgeniy Dorofeev
źródło
Brzydki układ, ale fajne podejście :)
MonoThreaded
warto wyjaśnić, że nie otrzymujesz z tego listy java.util.ArrayList, jak stwierdzono w pytaniu
planetjones
@MonoThreaded jak to jest brzydkie? dostajesz to, o co prosiłeś
CA Arefe
1
List<Something> result = new ArrayList<Something>(all);

EnumSetjest kolekcją Java, ponieważ implementuje Setinterfejs:

public interface Set<E> extends Collection<E> 

Więc wszystko, co możesz zrobić z kolekcją, możesz zrobić z plikiem EnumSet.

planetjones
źródło
0

To jest trochę bardziej czytelne:

Object[] allValues = all.getDeclaringClass().getEnumConstants();
Czarny Warzyw
źródło
1
Wtedy możesz po prostu zrobić Something.class.getEnumConstants()dobrze?
shyam
1
... lubSomething.values();
Peter Lawrey
0

Spróbuj tego:

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

jak ArrayListma konstruktor z Collection<? extends E>. Ale używaj tej metody tylko wtedy, gdy naprawdę chcesz użyć EnumSet.

Wszystkie wyliczenia mają dostęp do metody values(). Zwraca tablicę wszystkich wartości wyliczenia:

... = Arrays.asList(Something.values());
Joshua
źródło
0

Możesz również użyć:

Collections.singletonList(Something.values())
Topera
źródło
Otrzymuję hexCode
P Satish Patro
-2
private ComboBox gender;
private enum Selgender{Male,Famle};
ObservableList<Object> observableList  =FXCollections.observableArrayList(Selgender.values());
سيدا الشايقي
źródło