Füllen einer Liste mit allen Aufzählungswerten in Java


80

Ich möchte eine Liste mit allen möglichen Werten einer Aufzählung füllen.
Da ich mich kürzlich in sie verliebt habe EnumSet, habe ich sie genutztallOf()

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

Gibt es einen besseren Weg (wie bei einem nicht verschleierten Einzeiler), um das gleiche Ergebnis zu erzielen?


ArrayList <Something> list = new ArrayList <Something> (Arrays.asList (Something.values ​​()))
TacB0sS

Antworten:


168

Ich würde eine Liste an erster Stelle nicht verwenden, da ein EnumSet angemessener ist, aber Sie können es tun

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

oder

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

3
Manchmal schneidet EnumSet es nicht. Insbesondere wenn es auf die Bestellung ankommt
MonoThreaded

1
@MonoThreaded Welche Reihenfolge hatten Sie im Sinn? Ein EnumSet ist in der natürlichen Reihenfolge für eine Aufzählung. Die Liste befindet sich in derselben Reihenfolge wie das Set, sodass durch die Verwendung einer Liste hier nichts geändert wird.
Peter Lawrey

1
Leider ist die Bestellung für diese Frage nicht möglich. Ich glaube, Sie haben im ersten Beispiel Werte () gemeint.
MonoThreaded

@ PeterLawrey wir verwenden die ganze Zeit Enums. Wenn wir einen Workflow entwerfen, wird der Genehmigungsprozess möglicherweise nicht in Natural Orderdie Enum verschoben. Aus diesem Grund ist a List<Enum>im Vergleich zu an nützlich EnumSet.
Buzzsawddog


10

Es gibt einen Konstruktor, für ArrayListden

ArrayList(Collection<? extends E> c) 

Jetzt EnumSeterweitert, AbstractCollectionso dass Sie einfach tun können

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

8

Versuchen

enum E {
    E1, E2, E3
}

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

Hässliches Layout, aber nette Herangehensweise :)
MonoThreaded

Es lohnt sich zu klären, dass Sie keine java.util.ArrayList daraus erhalten, wie in der Frage angegeben
planetjones

@ MonoThreaded wie hässlich es ist? Sie bekommen, wonach Sie gefragt haben
Deadpool

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

EnumSetist eine Java-Sammlung, da sie die SetSchnittstelle implementiert :

public interface Set<E> extends Collection<E> 

Alles, was Sie mit einer Sammlung tun können, können Sie mit einer Sammlung tun EnumSet.


0

Dies ist etwas besser lesbar:

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

1
Dann könnten Sie einfach Something.class.getEnumConstants()richtig machen?
Shyam

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

0

Versuche dies:

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

wie ArrayListhat ein Konstruktor mit Collection<? extends E>. Verwenden Sie diese Methode jedoch nur, wenn Sie sie wirklich verwenden möchten EnumSet.

Alle Aufzählungen haben Zugriff auf die Methode values(). Es gibt ein Array aller Aufzählungswerte zurück:

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


-2
private ComboBox gender;
private enum Selgender{Male,Famle};
ObservableList<Object> observableList  =FXCollections.observableArrayList(Selgender.values());
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.