2012-01-22 19 views
15

Básicamente, lo que quiero hacer es comprobar dos enteros frente a un valor determinado, por lo tanto, clásicamente lo que se puede hacer es algo como esto:¿Hay alguna manera más simple de verificar valores múltiples contra un valor en un enunciado if?

//just to get some values to check 
int a, b; 
a = (int)(Math.random()*5); 
b = (int)(Math.random()*5); 

//the actual thing in question 
if(a == 0 || b == 0) 
{ 
//Then do something 
} 

Pero, ¿existe un formato más concisa para hacer esto? Posiblemente similar a esta (que devuelve un mal tipo de operando):

//just to get some values to check 
int a, b; 
a = (int)(Math.random()*5); 
b = (int)(Math.random()*5); 

//the actual thing in question 
if((a||b) == 0) 
{ 
//Then do something 
} 
+2

¿Por qué quieres incluso? – harold

+2

posible duplicado de [La mejor forma de formatear múltiples condiciones 'o' en una sentencia if (Java)] (http://stackoverflow.com/questions/7604814/best-way-to-format-multiple-or-conditions-in -an-if-statement-java) –

+0

porque el código se vería mejor entonces? –

Respuesta

21

Desafortunadamente, no existe tal construcción en Java.

Es este tipo de comparación es frecuente en su código, se puede aplicar una pequeña función que va a realizar la comprobación para usted:

public boolean oneOfEquals(int a, int b, int expected) { 
    return (a == expected) || (b == expected); 
} 

entonces se podría utilizar de esta manera:

if(oneOfEquals(a, b, 0)) { 
    // ... 
} 

Si no desea restringir yourselft a números enteros, puede hacer que la función anterior genérica:

public <T> boolean oneOfEquals(T a, T b, T expected) { 
    return a.equals(expected) || b.equals(expected); 
} 

Tenga en cuenta que en este caso el tiempo de ejecución de Java realizará boxeo automático y unboxing para tipos primitivos (como int), que es una pérdida de rendimiento.

+0

Sí, pero ¿y si tengo tres variables, o cuatro, o una cantidad mayor que por alguna razón no están en una matriz? Tendría que volver a escribir esta función cada vez para ajustarme a la diferente cantidad de entradas. – Amndeep7

+2

No exactamente, puede usar la lista de parámetros de longitud variable: 'public boolean oneOfEquals (T expected, T ... real) {...}' y for-loop en el cuerpo de la función. Te mostraré un ejemplo si quieres @ Amndeep7. – buc

+0

Parece lo suficientemente simple como para entender, una pregunta sin embargo, ¿qué es T ... real convertirse? ¿Es una lista de algún tipo o una matriz o qué? – Amndeep7

4

Creo que un bit a bit OR:

if ((a | b) == 0) . . . 

funcionaría si desea comprobar específicamente para 0. I' m no estoy seguro si esto ahorra tiempo de ejecución. Más al punto, crea un código críptico, que hará que el futuro mantenedor de este código te maldiga (incluso si eres tú mismo). Recomiendo seguir con la opción de escribir más.

Bah. Leí mal la lógica original de OP.

otro aire ...

Si desea probar si cualquiera de muchas variables es igual a un valor esperado, una función genérica podría funcionar:

public <T> boolean exists(T target, T... values) { 
    for (T value : values) { 
     if (target == null) { 
      if (value == null) { 
       return true; 
      } 
     } else if (target.equals(value)) { 
      return true; 
     } 
    } 
    return false; 
} 

Esto funcionará para cualquier cantidad de objetos de un tipo. Primitivas se autoboxan por lo que funcionará con ellos también. Su código original será algo como:

if (test(0, a, b)) { 
    // do something 
} 

(se necesita desesperadamente un nombre mejor método para siquiera considerar si esto una mejora con respecto a lo que tenemos ahora Incluso si la prueba se expande a 3 o 4 variables, pongo en duda. . la necesidad de este tipo de cosas) Tenga en cuenta que esto también funciona con matrices:

int[] values = { . . . }; 
if (test(0, values)) { . . . 

y que puede ser utilizado para probar si una matriz (o cualquiera de un conjunto de variables) es null.

+0

¿Pero hay una manera de generalizar esto? Como en, en lugar de solo verificar 0, también puedo comparar estos valores con otra variable, por ejemplo, una int llamada 'c'? – Amndeep7

+0

Nah, eso solo funciona si ambos son cero. –

+1

No funciona - si 'a = 1; b = 0; ', su prueba falla, la prueba original pasa. – Mat

0

No hay una sintaxis especial para eso. Podrías hacer una función para eso. Asumiendo al menos Java 1.5:

public <T> boolean eitherOneEquals(T o1, T o2, T expectedValue) { 
    return o1.equals(expectedValue) || o2.equals(expectedValue); 
} 

if(eitherOneEquals(o1, o2, expectedValue)) { 
    // do something... 
} 
2
if(a == 0 || b == 0) 
{ 
//Then do something 
} 

¿Por qué no mantenerlo legible? ¿Cuál es no conciso sobre esto? Por otro lado,

a = (int)(Math.random()*5); 

implica un lanzamiento innecesario. ¿Por qué no usar Random e invocar nextInt()?

+0

Nunca fui consciente de esa clase, siempre me habían enseñado a usar Math.random() , especialmente debido a que puede ser fácilmente adaptable al rango de valores que deseo crear. – Amndeep7

+1

Es fácil ajustar el límite de sus valores usando Random. Por ejemplo, un número aleatorio entre 1-6: 1 + myRand.nextInt (5); –

1

Incluso si usted ha usado la operación bit a bit como se sugiere Ted, las expresiones no son iguales, ya que se requiere al menos uno de las variables a ser cero y la segunda requiere tanto de ellos a ser cero .

En cuanto a su pregunta, no existe tal atajo en Java.

2

Para este ejemplo, se puede hacer

if (a * b == 0) 

o para las variables más

if (a * b * c * d == 0) 

mientras que más concisa que puede no ser tan clara. Para valores más grandes, debe convertir a long para evitar un desbordamiento.

+1

Es posible que necesite algo más grande que un largo para más de dos variables, si todas pueden ser del rango completo. – harold

+0

Muy cierto. Para los tipos más grandes, debe verificar cada uno. Pero para los valores '0 - 4' debería ser seguro . –

2

Puede poner los enteros en un conjunto y ver si contiene el valor dado. Using Guava:

if(newHashSet(a, b).contains(0)){ 
    // do something 
} 

Sin embargo, dos simples comparaciones int son probablemente más fácil de entender en este caso.

1

Puede probar este código:

public static boolean match (Object ref, Object... objects) 
{ 
    if (ref == null) 
     return false; 
    // 
    for (Object obj : objects) 
     if (obj.equals (ref)) 
      return true; 
    // 
    return false; 
} // match 

lo tanto, si se puede comprobar de esta manera:

if (match (reference, "123", "124", "125")) 
    ; // do something 
2

Aquí es una modificación de la respuesta de @ Buc que puede tomar cualquier número de argumentos:

public <T> boolean oneOfEquals(T expected, T... os) { 
    for (T o : os) { 
     if (expected.equals(o)) return true; 
    } 
    return false; 
} 
11

Puede hacer lo siguiente en simple java

Arrays.asList(a, b, c, d).contains(x); 
1

As referenced from this answer:

En Java 8+, podría utilizar un Stream y anyMatch. Algo así como

if (Stream.of(b, c, d).anyMatch(x -> x.equals(a))) { 
    // ... do something ... 
} 

Tenga en cuenta que esto no tiene la oportunidad de correr más lento que el otro si los controles, debido a la sobrecarga de envolver estos elementos en una corriente, para empezar.

Cuestiones relacionadas