Подтвердить что ты не робот

Список значений перечисления в java

Можно ли создать ArrayList значений enum (и манипулировать им)? Например:

enum MyEnum
{
   ONE, TWO
}

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

Ответ 1

Да, это определенно возможно, но вам придется делать

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

Затем вы можете добавить элементы в al: al.add(ONE) или al.add(TWO).

Ответ 2

Вы можете просто написать

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

Ответ 3

Ответ (EnumSet) Амита Дешпанде и ответ (.values) Марко Топольника верны. Вот немного больше информации.

Enum.values

Метод .values() - это неявно объявленный метод в Enum, добавленный компилятором. Он производит грубую массив, а не Collection. Конечно, можно использовать.

Особое примечание о документации: будучи необычным как неявно объявленный метод, метод .values() не указан среди методов класса Enum. Метод определен в Спецификации языка Java и упоминается в документе для Enum.valueOf.

EnumSet - быстрый и малый

К EnumSet к EnumSet относятся:

  • Крайняя скорость.
  • Компактное использование памяти.

Чтобы процитировать класс doc:

Множества Enum представлены внутри как битовые векторы. Это представление чрезвычайно компактно и эффективно. Пространство и время работы этого класса должны быть достаточно хорошими, чтобы позволить использовать его как высококачественную, типичную альтернативу традиционным "бит-флагам" на основе int. Даже массовые операции (такие как containsAll и retainAll) должны выполняться очень быстро, если их аргумент также является перечислением.

Учитывая это перечисление:

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

Сделайте EnumSet в одной строке.

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

Сбросьте консоль.

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

allAnimals: [DOG, CAT, BIRD, BAT]

Сделайте набор из подмножества объектов перечисления.

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

Посмотрите на документ класса, чтобы увидеть множество способов манипулирования коллекцией, включая добавление или удаление элементов.

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

Естественный заказ

Документ обещает, что Итератор для EnumSet находится в естественном порядке, порядок, в котором первоначально были объявлены значения перечисления.

Чтобы процитировать класс doc:

Итератор, возвращаемый методом итератора, пересекает элементы в их естественном порядке (порядок, в котором объявлены константы перечисления).

Честно говоря, с учетом этого обещания я смущен, почему это не SortedSet. Но, хорошо, хорошо. Мы можем при необходимости создать List из Set. Передайте любую Collection конструктору ArrayList и эти коллекции Iterator автоматически вызывают от вашего имени.

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

Сбросьте консоль.

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

При запуске.

list : [DOG, CAT, BIRD, BAT]

В Java 10 и более поздних версиях вы можете удобно создать немодифицируемый List, передав EnumSet.

List< Animal > nonModList = List.copyOf( allAnimals ) ;  // Or pass Animals.values() 

Ответ 4

Это возможно, но вы должны использовать EnumSet вместо

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

Ответ 5

Это более общее решение, которое может быть использовано для любого объекта Enum, поэтому не нужно использовать.

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

Теперь вы должны позвонить следующим образом:

constFromEnumToList(MiEnum.class);

Ответ 6

Перечисление - это еще один класс в Java, это должно быть возможно.

Более точно, перечисление является экземпляром Object: http://docs.oracle.com/javase/6/docs/api/java/lang/Enum.html

Итак, да, он должен работать.