web-dev-qa-db-fra.com

Liste des valeurs enum dans java

Est-il possible de créer ArrayList de valeurs enum (et de le manipuler)? Par exemple:

enum MyEnum
{
   ONE, TWO
}

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

Oui c'est certainement possible, mais vous devrez le faire

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

Vous pouvez ensuite ajouter des éléments à al: al.add(ONE) ou al.add(TWO).

21
arshajii

Vous pouvez simplement écrire

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

La réponse (EnumSet) de Amit Deshpande et la réponse (.values) De Marko Topolnik sont corrects. Voici un peu plus d'informations.

Enum.values

La méthode .values() est une méthode déclarée implicitement sur Enum , ajoutée par le compilateur. Il produit un tableau brut plutôt qu'un Collection . Certainement utilisable.

Note spéciale sur la documentation: étant inhabituelle en tant que méthode déclarée implicitement , la méthode .values() est non répertorié parmi les méthodes de la classe Enum. La méthode est définie dans la spécification du langage Java , et est mentionnée dans le document relatif à Enum.valueOf .

EnumSet - Rapide & Petit

Les avantages de EnumSet incluent:

  • Vitesse extrême.
  • Utilisation compacte de la mémoire.

Pour citer le document de classe:

Les ensembles d'énumération sont représentés de manière interne en tant que vecteurs de bits. Cette représentation est extrêmement compacte et efficace. Les performances spatio-temporelles de cette classe doivent être suffisantes pour permettre son utilisation en tant qu’alternative de type haute qualité et de haute qualité aux "indicateurs de bits" classiques basés sur int. Même les opérations en bloc (telles que containsAll et rétentionAll) devraient s'exécuter très rapidement si leur argument est également un ensemble énuméré.

Étant donné cet enum:

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

Faites un EnumSet en une ligne.

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

Dump à la console.

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

tous les animaux: [CHIEN, CHAT, OISEAU, BAT]

Créez un ensemble à partir d'un sous-ensemble des objets enum.

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

Regardez le document de classe pour voir de nombreuses façons de manipuler la collection, notamment en ajoutant ou en supprimant des éléments.

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

Ordre naturel

La doc promet que l'itérateur pour EnumSet est dans l'ordre naturel, l'ordre dans lequel les valeurs de l'énum ont été déclarées à l'origine.

Pour citer le document de classe:

L'itérateur renvoyé par la méthode iterator parcourt les éléments dans leur ordre naturel (l'ordre dans lequel les constantes enum sont déclarées).

Franchement, étant donné cette promesse, je ne comprends pas pourquoi ce n’est pas un SortedSet . Mais bon, ça va. Nous pouvons créer un List à partir de Set si vous le souhaitez. Passez n'importe quel Collection au constructeur de ArrayList et la collection Iterator de cette collection est automatiquement appelée en votre nom.

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

Dump à la console.

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

Quand couru.

list : [DOG, CAT, BIRD, BAT]

Dans Java 10 et versions ultérieures, vous pouvez facilement créer un List non modifiable en passant le EnumSet.

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

C'est possible mais vous devriez utiliser EnumSet

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

C'est une solution plus générique, qui peut être utilisée pour tout objet Enum, alors soyez libre de tout utilisé.

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

Maintenant, vous devez appeler de cette façon:

constFromEnumToList(MiEnum.class);
2
iarteaga

Une énumération est juste une autre classe en Java, cela devrait être possible.

Plus précisément, une énumération est une instance de Object: http://docs.Oracle.com/javase/6/docs/api/Java/lang/Enum.html

Alors oui, ça devrait marcher.

1
StackOverflowed