logicos - sintaxis de los operadores relacionales en java
usar operadores relacionales en switch (7)
Los documentos para el estado de la declaración de mayúsculas y minúsculas :
una sentencia switch prueba expresiones basadas solo en un entero único, valor enumerado u objeto String.
Entonces no hay boolean Hacerlo no tendría sentido ya que solo tiene dos valores: true
o falso.
Lo que podrías hacer es escribir un método que verifique el puntaje y luego devuelva uno de los tipos que el switch
puede manejar
Por ejemplo:
enum CheckScore {
SCORE_HIGHER_EQUAL_90,
...
}
public CheckScore checkScore(int score) {
if(score >= 90) {
return SCORE_HIGHER_EQUAL_90;
} else if(...) {
return ...
}
}
y luego úsala en tu interruptor:
switch(checkScore(score)) {
case SCORE_HIGHER_EQUAL_90:
// do stuff
}
... O simplemente podría usar if, else-if, else
directamente!
¿Hay alguna manera de usar operadores relacionales (<, <=,>,> =) en una instrucción switch?
int score = 95;
switch(score) {
case (score >= 90):
// do stuff
}
el ejemplo anterior (obviamente) no funciona
Nunca funcionará. Debes entender lo que hace el switch
en primer lugar.
Ejecutará las instrucciones que caen debajo del caso que coincide con el argumento del interruptor.
En este caso, el score
es un argumento que es 95
pero el score>=90
siempre evaluará a true
o false
y nunca coincide con un número entero.
Deberías usar if
declaraciones en su lugar.
También Java no permite booleans
en cajas de conmutadores así que sí.
Simplemente NO
int score = 95;
switch(score) {
case (score >= 90):
// do stuff
}
Estás pasando un valor int
para switch
. Entonces el caso debe estar en valores int
, donde
(score >= 90)
Activa boolean
Su caso es un buen candidato para if else
Desafortunadamente , NO , aunque puede usar el case
fallido (tipo de hacky) al agrupar varias declaraciones de caso sin break
e implementar código cuando termina un rango:
int score = 95;
switch(score) {
..
case 79: System.out.println("value in 70-79 range"); break;
case 80:
..
case 85: System.out.println("value in 80-85 range"); break;
case 90:
case 91:
case 92:
case 93:
case 94:
case 95: System.out.println("value in 90-95 range"); break;
default: break;
}
En mi humilde opinión, usando if
sería más apropiado en su caso particular.
No, no puedes.
Desde jls-14.11
The type of the Expression must be char, byte, short, int, Character, Byte, Short, Integer, String, or an enum type (§8.9), or a compile-time error occurs.
Los operadores relacionales (<, <=,>,> =) dan como resultado boolean
y no están permitidos.
Todo lo siguiente debe ser verdadero o se produce un error en tiempo de compilación:
Cada expresión de constante de caso asociada con una instrucción de conmutación debe ser asignable (§5.2) al tipo de Expresión de conmutación.
No hay dos expresiones de constante de caso asociadas a una instrucción de conmutación que puedan tener el mismo valor.
Ninguna etiqueta de interruptor es nula.
Como máximo, una etiqueta predeterminada puede estar asociada a la misma declaración de cambio.
Obviamente, esto no es posible como una construcción de lenguaje. Pero, solo por diversión, ¡podríamos implementarlo solos!
public class Switch<T, V> {
public static interface Action<V> {
V run();
}
private final T value;
private boolean runAction = false;
private boolean completed = false;
private Action<V> actionToRun;
public Switch(T value) {
this.value = value;
}
static public <T, V> Switch<T, V> on(T value) {
return new Switch<T, V>(value);
}
public Switch<T, V> ifTrue(boolean condition) {
runAction |= condition;
return this;
}
public Switch<T, V> ifEquals(T other) {
return ifTrue(value.equals(other));
}
public Switch<T, V> byDefault(Action<V> action) {
this.actionToRun = action;
return this;
}
public Switch<T, V> then(Action<V> action) {
if (runAction && !completed) {
actionToRun = action;
completed = true;
}
return this;
}
public V getResult() {
if (actionToRun == null) {
throw new IllegalStateException("none of conditions matched and no default action was provided");
}
return actionToRun.run();
}
}
Switch
acepta cualquier valor para encender y luego proporciona funcionalidad para coincidir con condiciones booleanas (método ifTrue
) o por coincidencias exactas (método ifEquals
). Proporcionar un valor para encender es necesario solo para la última característica.
Después de getResult
las condiciones, el usuario invoca getResult
para obtener el resultado.
Por ejemplo, podríamos crear un método que nos diga qué piensa sobre nuestro puntaje:
String tellMeMyScore(int score) {
return Switch.<Integer, String> on(score).byDefault(new Action<String>() {
public String run() {
return "really poor score";
}
}).ifTrue(score > 95).then(new Action<String>() {
public String run() {
return "you rock!";
}
}).ifTrue(score > 65).then(new Action<String>() {
public String run() {
return "not bad, not bad";
}
}).ifEquals(42).then(new Action<String>() {
public String run() {
return "that''s the answer!";
}
}).getResult();
}
Esta simple prueba:
for (int score : new int[] { 97, 85, 66, 55, 42, 32, 4 }) {
System.out.println(score + ": " + tellMeMyScore(score));
}
Imprime:
97: you rock!
85: not bad, not bad
66: not bad, not bad
55: really poor score
42: that''s the answer!
32: really poor score
4: really poor score
Esto podría ayudarlo si necesita hacerlo con el interruptor mismo,
char g =''X'';
int marks = 65;
switch(marks/10)
{
case 1:
case 2:
case 3:
case 4: g = ''F'';
break;
case 5: g = ''E'';
break;
case 6: g = ''D'';
break;
case 7: g = ''C'';
break;
case 8: g = ''B'';
break;
case 9:
case 10: g = ''A'';
break;
}
System.out.println(g);
Funciona de esta manera,
if(marks<50)
g=''F'';
else if(marks<60)
g=''E'';
else if(marks<70)
g=''D'';
else if(marks<80)
g=''C'';
else if(marks<90)
g=''B'';
else if(marks<=100)
g=''A'';