Aquí está mi problema: estoy buscando (si es que existe) el enum equivalente de ArrayList.contains();
.
Aquí hay una muestra de mi problema de código:
enum choices {a1, a2, b1, b2};
if(choices.???(a1)}{
//do this
}
Ahora, me doy cuenta de que una ArrayList
deStrings
sería la mejor ruta aquí, pero tengo que ejecutar mi contenido de enumeración a través de un interruptor / caso en otro lugar. De ahí mi problema.
Suponiendo que algo como esto no exista, ¿cómo podría hacerlo?
Respuestas:
Esto debería hacerlo:
De esta manera, no tiene que preocuparse por agregar valores de enumeración adicionales más adelante, todos están marcados.
Editar: si la enumeración es muy grande, puede pegar los valores en un HashSet:
Entonces puedes simplemente hacer: lo
values.contains("your string")
que devuelve verdadero o falso.fuente
Utilice la biblioteca lang3 de Apache commons en su lugar
fuente
Puedes usar
Enum.valueOf()
Si espera que la verificación falle con frecuencia, es mejor que use un bucle simple como lo han demostrado otros, si sus enumeraciones contienen muchos valores, quizás builda
HashSet
o similar de sus valores de enumeración convertidos en una cadena y consulte esoHashSet
.fuente
EnumUtils.isValidEnum(MyEnum.class, myValue)
usa una lógica similar y la OMI tiene sentido agregar una biblioteca completa para esta tarea trivialSi está utilizando Java 1.8, puede elegir Stream + Lambda para implementar esto:
fuente
Aun mejor:
fuente
Guavas Enums podría ser tu amigo
Por ejemplo, esto:
fuente
Primero puede convertir la enumeración a Lista y luego usar el método de lista contiene
fuente
Pocas suposiciones:
1) Sin intento / captura, ya que es un control de flujo excepcional
2) El método 'contiene' debe ser rápido, ya que generalmente se ejecuta varias veces.
3) El espacio no es limitado (común para soluciones ordinarias)
fuente
Aquí se han mencionado un par de bibliotecas, pero extraño la que estaba buscando: ¡Primavera!
Existe ObjectUtils # usesConstant, que no distingue entre mayúsculas y minúsculas de forma predeterminada, pero puede ser estricto si lo desea. Se usa así:
Nota: Utilicé el método sobrecargado aquí para demostrar cómo usar la comprobación de mayúsculas y minúsculas. Puede omitir el booleano para tener un comportamiento que no distinga entre mayúsculas y minúsculas.
Sin embargo, tenga cuidado con las enumeraciones grandes, ya que no usan la implementación del Mapa como algunos lo hacen ...
Como beneficio adicional, también proporciona una variante entre mayúsculas y minúsculas del valueOf: ObjectUtils # caseInsensitiveValueOf
fuente
Puedes usar esto
YourEnum {A1, A2, B1, B2}
La actualización sugerida por @ wightwulf1944 se incorpora para hacer que la solución sea más eficiente.
fuente
stream()
en un set significa que está iterando en cada elemento del conjunto en lugar de aprovechar la tabla hash subyacente que será más rápida. Para mejorar esto, es mejor almacenar en caché el conjunto creado y utilizar sucontains()
método en su lugar. Si debe obtener una transmisión, úselaArrays.stream()
en su lugar.No creo que exista, pero puedes hacer algo como esto:
Editar:
Vea la versión de Richard de esto, ya que es más apropiado ya que esto no funcionará a menos que lo convierta para usar Strings, lo que Richards hace.
fuente
.values()
documentado en download.oracle.com/javase/6/docs/api/java/lang/Enum.html ?Java Streams proporciona una forma elegante de hacerlo
Devuelve: verdadero si alguno de los elementos de la secuencia coincide con el valor proporcionado; de lo contrario, falso
fuente
¿Por qué no combinar la respuesta de Pablo con un valueOf ()?
fuente
Este enfoque se puede usar para verificar cualquiera
Enum
, puede agregarlo a unaUtils
clase:Úselo de esta manera:
fuente
Creé la siguiente clase para esta validación
ejemplo de uso:
fuente
Puede usar
valueOf("a1")
si desea buscar por Stringfuente
Es una enumeración, esos son valores constantes, por lo que si está en una declaración de interruptor, solo está haciendo algo como esto:
Además, ¿por qué necesitarías saber qué se declara como una constante?
fuente
Con guayaba es aún más simple:
fuente
MyEnum.values()
devuelve una matriz de instancias MyEnum yMyEnum.value().toString()
devuelve una representación de cadena de este objeto de matriz (solo una cadena como "[LMyEnum; @ 15b94ed3").name()
lugar de.toString()
(a menos que anule el método toString predeterminado). Consulte esto para obtener más información: Diferencia entre enum .name () y .toString ()Esto combina todos los enfoques de los métodos anteriores y debe tener un rendimiento equivalente. Se puede usar para cualquier enumeración, incluye la solución "Editar" de @Richard H y usa Excepciones para valores no válidos como @bestsss. El único inconveniente es que la clase necesita ser especificada, pero eso convierte esto en un trazador de líneas.
}
fuente
fuente
solución para verificar si el valor está presente y obtener un valor de enumeración a cambio:
fuente
Esta funciona para mí:
fuente
Si está utilizando Java 8 o superior, puede hacer esto:
fuente
fuente
Puede hacerlo como un método contiene:
o simplemente puede usarlo con su bloque de código:
fuente
también puedes usar: com.google.common.base.Enums
Enums.getIfPresent (varEnum.class, varToLookFor) devuelve un Opcional
Enums.getIfPresent (fooEnum.class, myVariable) .isPresent ()? Enums.getIfPresent (fooEnum.class, myVariable) .get: fooEnum.OTHERS
fuente
Yo solo escribiría
Enum # equals solo funciona con la comparación de objetos.
fuente
fuente
enum
son bastante poderosos en Java. Puede agregar fácilmente uncontains
método a su enumeración (como agregaría un método a una clase):fuente
s.equals("b1") || s.equals("b2")
??s.equals("xx")
para cada enumeración que agregue más adelante.