Можно ли создать ArrayList значений enum (и манипулировать им)? Например:
enum MyEnum
{
ONE, TWO
}
MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);
Можно ли создать ArrayList значений enum (и манипулировать им)? Например:
enum MyEnum
{
ONE, TWO
}
MyEnum my = MyEnum.ONE;
List <?> al = new ArrayList <?>();
al.add(my);
al.remove(al.size()-1);
Да, это определенно возможно, но вам придется делать
List<MyEnum> al = new ArrayList<MyEnum>();
Затем вы можете добавить элементы в al
: al.add(ONE)
или al.add(TWO)
.
Вы можете просто написать
new ArrayList<MyEnum>(Arrays.asList(MyEnum.values()));
Ответ (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()
Это возможно, но вы должны использовать EnumSet
вместо
enum MyEnum {
ONE, TWO;
public static final EnumSet<MyEnum> all = EnumSet.of(ONE, TWO);
}
Это более общее решение, которое может быть использовано для любого объекта 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);
Перечисление - это еще один класс в Java, это должно быть возможно.
Более точно, перечисление является экземпляром Object: http://docs.oracle.com/javase/6/docs/api/java/lang/Enum.html
Итак, да, он должен работать.