Voici mon problème - je cherche (s'il existe) l'équivalent enum de ArrayList.contains();
.
Voici un exemple de mon problème de code:
enum choices {a1, a2, b1, b2};
if(choices.???(a1)}{
//do this
}
Maintenant, je me rends compte qu'un ArrayList
of Strings
serait la meilleure route ici, mais je dois exécuter mon contenu enum via un commutateur / boîtier ailleurs. D'où mon problème.
En supposant que quelque chose comme ça n'existe pas, comment pourrais-je le faire?
Réponses:
Cela devrait le faire:
De cette façon, vous n'avez pas à vous soucier d'ajouter des valeurs d'énumération supplémentaires plus tard, elles sont toutes vérifiées.
Edit: Si l'énumération est très grande, vous pouvez coller les valeurs dans un HashSet:
Ensuite, vous pouvez simplement faire:
values.contains("your string")
qui renvoie vrai ou faux.la source
Utilisez la librairie Apache commons lang3 à la place
la source
Vous pouvez utiliser
Enum.valueOf()
Si vous vous attendez à ce que la vérification échoue souvent, vous feriez peut-être mieux d'utiliser une simple boucle comme d'autres l'ont montré - si vos enums contiennent de nombreuses valeurs, peut-être builda
HashSet
ou similaire de vos valeurs d'énumération converties en une chaîne et interrogez-la à laHashSet
place.la source
EnumUtils.isValidEnum(MyEnum.class, myValue)
utilise une logique similaire et IMO, il est logique d'ajouter une bibliothèque entière pour cette tâche trivialeSi vous utilisez Java 1.8, vous pouvez choisir Stream + Lambda pour implémenter ceci:
la source
Guavas Enums pourrait être votre ami
Comme par exemple ceci:
la source
Encore mieux:
la source
Vous pouvez d'abord convertir l'énumération en liste, puis utiliser la méthode list contains
la source
Quelques hypothèses:
1) Pas de try / catch, car il s'agit d'un contrôle de flux exceptionnel
2) La méthode «contient» doit être rapide, car elle s'exécute généralement plusieurs fois.
3) L'espace n'est pas limité (courant pour les solutions ordinaires)
la source
Quelques bibliothèques ont été mentionnées ici, mais celle que je recherchais me manque: le printemps!
Il y a le ObjectUtils # containsConstant qui est insensible à la casse par défaut, mais peut être strict si vous le souhaitez. Il est utilisé comme ceci:
Remarque: j'ai utilisé la méthode surchargée ici pour montrer comment utiliser la vérification sensible à la casse. Vous pouvez omettre le booléen pour avoir un comportement insensible à la casse.
Soyez prudent avec les grandes énumérations, car elles n'utilisent pas l'implémentation de Map comme certains le font ...
En prime, il fournit également une variante insensible à la casse de valueOf: ObjectUtils # caseInsensitiveValueOf
la source
Vous pouvez utiliser ceci
YourEnum {A1, A2, B1, B2}
La mise à jour suggérée par @ wightwulf1944 est intégrée pour rendre la solution plus efficace.
la source
stream()
sur un ensemble signifie que vous itérez sur chaque élément de l'ensemble au lieu de profiter de la table de hachage sous-jacente qui sera plus rapide. Pour améliorer cela, il est préférable de mettre en cache l'ensemble créé et d'utiliser sacontains()
méthode à la place. Si vous devez obtenir un flux, utilisez à laArrays.stream()
place.Je ne pense pas que ce soit le cas, mais vous pouvez faire quelque chose comme ceci:
Éditer:
Veuillez consulter la version de Richard car elle est plus appropriée car cela ne fonctionnera pas à moins que vous ne la convertissiez pour utiliser des chaînes, ce que fait Richards.
la source
.values()
documenté sur download.oracle.com/javase/6/docs/api/java/lang/Enum.html ?Java Streams offre un moyen élégant de le faire
Renvoie: vrai si des éléments du flux correspondent à la valeur fournie, sinon faux
la source
Pourquoi ne pas combiner la réponse de Pablo avec un valueOf ()?
la source
Cette approche peut être utilisée pour vérifier n'importe quel
Enum
, vous pouvez l'ajouter à uneUtils
classe:Utilisez-le de cette façon:
la source
J'ai créé la classe suivante pour cette validation
exemple d'utilisation:
la source
Vous pouvez utiliser
valueOf("a1")
si vous souhaitez rechercher par chaînela source
C'est une énumération, ce sont des valeurs constantes, donc si c'est dans une instruction switch, il fait juste quelque chose comme ceci:
Aussi, pourquoi auriez-vous besoin de savoir ce qui est déclaré comme constante?
la source
Avec la goyave, c'est encore plus simple:
la source
MyEnum.values()
renvoie un tableau d'instances MyEnum etMyEnum.value().toString()
retourne une représentation sous forme de chaîne de cet objet tableau (juste une chaîne comme "[LMyEnum; @ 15b94ed3").name()
au lieu de.toString()
(sauf si vous remplacez la méthode toString par défaut). Voir ceci pour plus d'informations: Différence entre enum .name () et .toString ()Cela combine toutes les approches des méthodes précédentes et devrait avoir des performances équivalentes. Il peut être utilisé pour n'importe quelle énumération, en ligne avec la solution "Edit" de @Richard H, et utilise des exceptions pour les valeurs invalides comme @bestsss. Le seul compromis est que la classe doit être spécifiée, mais cela transforme cela en deux lignes.
}
la source
la source
solution pour vérifier si la valeur est présente et obtenir la valeur enum en retour:
la source
Celui-ci fonctionne pour moi:
la source
Si vous utilisez Java 8 ou supérieur, vous pouvez le faire:
la source
la source
Vous pouvez en faire une méthode contient:
ou vous pouvez simplement l'utiliser avec votre bloc de code:
la source
vous pouvez également utiliser: com.google.common.base.Enums
Enums.getIfPresent (varEnum.class, varToLookFor) renvoie une option
Enums.getIfPresent (fooEnum.class, myVariable) .isPresent ()? Enums.getIfPresent (fooEnum.class, myVariable) .get: fooEnum.OTHERS
la source
J'écrirais juste
Enum # equals ne fonctionne qu'avec la comparaison d'objets.
la source
la source
enum
sont assez puissants en Java. Vous pouvez facilement ajouter unecontains
méthode à votre énumération (comme vous ajouteriez une méthode à une classe):la source
s.equals("b1") || s.equals("b2")
??s.equals("xx")
pour chaque énumération que vous ajoutez plus tard.