2011-09-30 9 views
36

Una pregunta simple pero Google no ha ayudado mucho.La mejor manera de formatear múltiples condiciones 'o' en una sentencia if (Java)

tengo una sentencia if con muchas condiciones (tienen que comprobar si hay 10 o 15 constantes para ver si alguno de ellos está presente.)

En lugar de escribir algo como:

if (x == 12 || x == 16 || x == 19 || ...) 

está ahí cualquier forma de formatearlo como

if x is [12, 16, 19]? 

Solo me preguntaba si hay una forma más fácil de codificar esto, cualquier ayuda apreciada.

Editar: Las respuestas han sido muy útiles, pero algunas personas me pidieron que agregara más detalles, así que lo haré para saciar su curiosidad. Estaba haciendo una clase de validación de fecha que necesitaba para asegurarme de que los días no eran> 30 en los meses que tienen solo 30 días (de los cuales hay 4, creo) y estaba escribiendo una declaración if para verificar cosas como esta:

if (day > 30 && (month == 4 || month == 6 || month == 9 || month == 11)) 

Me preguntaba si había una forma más rápida de codificar cosas así, muchas de las respuestas a continuación me han ayudado :).

+0

¿Puedes dar un mejor ejemplo de lo que intentas hacer? Tal vez una solución yace en pensar sobre eso? –

Respuesta

37

que utilizan este tipo de patrón de frecuencia. Es muy compacto:

// Define a constant in your class. Use a HashSet for performance 
private static final Set<Integer> values = new HashSet<Integer>(Arrays.asList(12, 16, 19)); 

// In your method: 
if (values.contains(x)) { 
    ... 
} 

Un HashSet se utiliza aquí para dar un buen rendimiento de consulta - incluso muy grandes conjuntos de patata son capaces de ejecutar de forma extremadamente rápida.

Si el rendimiento no es importante, puede codificar la esencia de la misma en una sola línea:

if (Arrays.asList(12, 16, 19).contains(x)) 

pero sabe que va a crear un nuevo ArrayList cada vez que se ejecuta.

+2

si (Arrays.asList (12, 16, 19) .contains (x)) –

+0

Brian, agregó su sugerencia con una advertencia rendimiento – Bohemian

+1

prefiero usar un '' Set' que un list' para esto, pero eso es realmente no tendrá ningún efecto sobre la que pocos elementos. –

3

Puede buscar la presencia de una clave de mapa o ver si está en un conjunto.

Dependiendo de lo que en realidad está haciendo , sin embargo, usted podría estar tratando de resolver el problema equivocado :)

3

Usar una colección de algún tipo - esto hará que el código sea más fácil de leer y ocultar todo esas constantes. Una forma sencilla sería con una lista:

// Declared with constants 
private static List<Integer> myConstants = new ArrayList<Integer>(){{ 
    add(12); 
    add(16); 
    add(19); 
}}; 

// Wherever you are checking for presence of the constant 
if(myConstants.contains(x)){ 
    // ETC 
} 

Como puntos de Bohemia fuera de la lista de constantes pueden ser estáticos por lo que es accesible en más de un lugar.

Para cualquier persona interesada, la lista en mi ejemplo está usando double brace initialization. Desde que me encontré recientemente me pareció bueno escribir & inicializaciones de listas sucias.

+1

o 'if (Arrays.asList (new int [] {12,16,19}). Contains (x)) {...}' –

+0

@Bala seguro! En cualquier caso, una lista es solo un ejemplo de una colección para usar aquí. Como una de las otras respuestas sugirieron un conjunto podría ser mejor para asegurar las constantes son únicos ... o una tabla hash para acelerar la mirada hacia arriba, etc. –

10

¿Desea cambiar a este ??

switch(x) { 
    case 12: 
    case 16: 
    case 19: 
     //Do something 
     break; 
    default: 
     //Do nothing or something else.. 
     break; 
} 
3

Si el conjunto de posibilidades es "compacto" (es decir, mayor valor - valor más pequeño es, por ejemplo, menos de 200) que podría considerar una tabla de búsqueda. Esto sería especialmente útil si tuviera una estructura como

if (x == 12 || x == 16 || x == 19 || ...) 
else if (x==34 || x == 55 || ...) 
else if (...) 

Configurar una matriz con valores de la identificación de la rama que deben tomarse (1, 2, 3 en el ejemplo anterior) y luego se convierten en sus pruebas

switch(dispatchTable[x]) 
{ 
    case 1: 
     ... 
     break; 
    case 2: 
     ... 
     break; 
    case 3: 
     ... 
     break; 
} 

Si esto es apropiado o no depende de la semántica del problema.

Si una matriz no es apropiada, puede usar un Map<Integer,Integer>, o si solo desea probar la membresía para un solo enunciado, un Set<Integer> lo haría.Eso es mucho poder de fuego para una declaración simple de if, sin embargo, por lo tanto, sin más contexto, es difícil guiarlo en la dirección correcta.

4

ningún usted no puede hacer eso en Java. sin embargo se puede escribir un método de la siguiente manera:

boolean isContains(int i, int ... numbers) { 
    // code to check if i is one of the numbers 
    for (int n : numbers) { 
     if (i == n) return true; 
    } 
    return false; 
} 
2

Con Java 8, se puede usar una corriente primitiva:

if (IntStream.of(12, 16, 19).anyMatch(i -> i == x)) 

pero esto puede tener una ligera sobrecarga (o no), dependiendo del número de de comparaciones.

Cuestiones relacionadas