2012-10-28 13 views
33

Czy jest możliwe utworzenie ArrayList wartości wyliczenia (i manipulowanie nim)? Na przykład:Lista wartości wyliczonych w java

enum MyEnum 
{ 
    ONE, TWO 
} 

MyEnum my = MyEnum.ONE; 
List <?> al = new ArrayList <?>(); 
al.add(my); 
al.remove(al.size()-1); 

Odpowiedz

17

Tak to jest na pewno możliwe, ale trzeba będzie zrobić

List<MyEnum> al = new ArrayList<MyEnum>(); 

Można następnie dodać elementy do al: al.add(ONE) lub al.add(TWO).

+1

Powoduje to wyświetlenie pustej listy. –

+0

@BasilBourque To zależy od interpretacji pytania. Zrobiłem edycję wyjaśniającą. – arshajii

10

Jest to możliwe, ale należy użyć EnumSet zamiast

enum MyEnum { 
    ONE, TWO; 
    public static final EnumSet<MyEnum> all = EnumSet.of(ONE, TWO); 
} 
+4

Dlaczego należy używać 'EnumSet'? Co jeśli OP chce uporządkowanej listy? – arshajii

+0

Tak, spróbuję EnumSet, ale po prostu ciekawi ArrayList. – Alf

+3

@ A.R.S. Elementy w "EnumSet" są w naturalnej kolejności. Sprawdź dokument java doc –

88

można po prostu napisać

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

Ktoś wyjaśnia, dlaczego nie jest to "wybrana odpowiedź"? – Debriter

+0

Ponieważ wybrana odpowiedź jest tak dobra, jak ta, jak sądzę. –

2

Jest to bardziej ogólne rozwiązanie, które można stosować do dowolnego obiektu Enum, więc być wolne używane.

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

Teraz należy wywołać w ten sposób:

constFromEnumToList(MiEnum.class); 
+1

Jest to niezwykle skomplikowane i nie zapewnia żadnej ochrony typu (część z tego powodu, że typ "enum" został dodany do Javy). – squid314

+1

Myślę, że enum.values ​​() jest znacznie łatwiejszym podejściem, aby uzyskać kolekcję swoich wyrażeń. –

10

The Answer (EnumSet) Amit Deshpande i the Answer (.values) Marko Topolnik są zarówno poprawne. Oto trochę więcej informacji.

Sposób .values() jest niejawnie zadeklarowana metoda na Enum, dodane przez kompilator. Generuje raczej surowy układ niż Collection. Z pewnością użyteczny.

Specjalna uwaga o dokumentacji: Będąc niezwykły jako niejawnie zadeklarowanej metody metoda .values() jest nie wymienione wśród metod w klasie Enum. Metoda jest defined in the Java Language Specification i jest wymieniona w dokumencie dla Enum.valueOf.

Szybko & Małe

upsides do EnumSet obejmują:

  • Ekstremalne prędkości.
  • Kompaktowe wykorzystanie pamięci.

Przytoczyć klasę DOC

zestawy Enum reprezentowane są wewnętrznie jako bitowych wektorów. Ta reprezentacja jest niezwykle kompaktowa i wydajna. Wydajność w czasie i przestrzeni tej klasy powinna być wystarczająco dobra, aby umożliwić jej użycie jako wysokiej jakości, bezpiecznej dla zdrowia alternatywy dla tradycyjnych "bitowych flag"."Operacje Nawet masowych (takich jak containsAll i retainAll) powinny działać bardzo szybko, jeśli ich argumentem jest również zestaw enum

Biorąc pod uwagę ten ENUM:..

enum Animal 
{ 
    DOG , CAT , BIRD , BAT ; 
} 

Złóż EnumSet w jednej linii

EnumSet<Animal> allAnimals = EnumSet.allOf(Animal.class); 

Dump pocieszyć.

System.out.println("allAnimals : " + allAnimals); 

allAnimals [psa, kota, ptaka, BAT]

stanowią pary z podzbiór obiektów typu wyliczeniowego.

EnumSet<Animal> flyingAnimals = EnumSet.of(BIRD , BAT); 

Spójrz na the class doc zobaczyć wiele sposobów manipulowania kolekcję tym dodawanie lub usuwanie elementów.

EnumSet<Animal> featheredFlyingAnimals = 
    EnumSet.copyOf(flyingAnimals).remove(BAT); 

Natural Order

Doc obiecuje iterator EnumSet jest w naturalny porządek, kolejność, w jakiej wartości wyliczenia były pierwotnie zadeklarowane.

Cytując klasy Doc:

Iterator zwrócony przez metody iteracyjnej przemierza elementy w ich naturalnym porządku (kolejności, w jakiej zostały zgłoszone stałe enum).

Szczerze mówiąc, biorąc pod uwagę tę obietnicę, jestem zdezorientowany, dlaczego to nie jest SortedSet. Ale, no cóż, wystarczająco dobrze. W razie potrzeby możemy utworzyć List z Set. Przekaż dowolny Collection do konstruktora z ArrayList, a kolekcja Iterator zostanie automatycznie wywołana w Twoim imieniu.

List<Animal> list = new ArrayList<>(allAnimals); 

Zrzut na konsolę.

System.out.println("list : " + list); 

Po uruchomieniu.

list : [DOG, CAT, BIRD, BAT] 
+0

Doskonały wgląd w tę odpowiedź! – Alfabravo

Powiązane problemy