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?


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

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


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)

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

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.


0

To jest trochę bardziej czytelne:

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

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


-2
private ComboBox gender;
private enum Selgender{Male,Famle};
ObservableList<Object> observableList  =FXCollections.observableArrayList(Selgender.values());
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.