2011-01-28 5 views

Respuesta

12

No recomiendo esto, pero es divertido. en java6

String op = '+'; 
int first= 10; 
int second = 20; 
ScriptEngineManager scm = new ScriptEngineManager(); 
ScriptEngine jsEngine = scm.getEngineByName("JavaScript"); 
Integer result = (Integer) jsEngine.eval(first+op+second); 

ir con el interruptor, pero recuerde que debe convertir el operador de cadena charla como interruptor no funciona con cadenas todavía.

switch(op.charAt(0)){ 
    case '+': 
     return first + second; 
     break; 
    // and so on.. 
+0

lol no sabía que podía importar el motor de JavaScript: D para la segunda opción: sé perfectamente que podría usar un conmutador (o un si ...) quería un método más "elegante" – dynamic

+0

puede implementar un patrón de intérprete pero tal vez es exagerado para lo que quieres. Hay un video de GoogleIO en algún lugar sobre la refacturación de un problema como el suyo. no puede recordar el nombre :( – Mauricio

+0

cómo puede devolver esto: return =; return ||; return +;? – delive

6
switch (op.charAt(0)) { 
    case '+': return first + second; 
    case '-': return first - second; 
    // ... 
} 
+1

Claramente OP no está utilizando un char, pero se puede usar 'op.charAT (0) '. Asegúrate de verificar la longitud. – marcog

+0

Dependiendo de la situación, podría ser más fácil usar un char en su lugar, pero he actualizado la respuesta. – rpjohnst

0
public double doMath(int first, int second, char op){ 

    switch(op){ 
    case '+': 
     return first + second; 
     break; 
    case '-': 
     return first - second; 
     break; 
    case '*': 
     return first * second; 
     break; 
    case '/': 
     return first/second; 
     break; 
    default: 
     return 0; 
    } 
} 
0
switch(string){ 
} 

(interruptor de cadenas) se permitirá en Java7. Ahora se puede cambiar con carbón

switch(string.charAt(0)){ 
    case '+' : ... 
} 

como se mencionó anteriormente

+0

case '+' es para un char, es probable que desee comillas dobles para redondearlo! – berry120

2

puede probar el siguiente código. Está orientado a objetos, bastante genérico, y se puede ampliar fácilmente para añadir nuevos operadores, incluidos los operadores con un número diferente de argumentos:

public abstract class Operator { 
    public abstract Integer compute(Integer...values); 
} 

public class Plus extends Operator { 
    public Integer compute(Integer...values) { 
    return values[0] + values[1]; 
    } 
} 

public class Minus extends Operator { 
    public Integer compute(Integer...values) { 
    return values[0] - values[1]; 
    } 
} 

public class Multiply extends Operator { 
    public Integer compute(Integer...values) { 
    return values[0] * values[1]; 
    } 
} 


public class Divide extends Operator { 
    public Integer compute(Integer...values) { 
    return values[0]/values[1]; 
    } 
} 

Map operatorMap = createOperatorMap(); 

public Map createOperatorMap() { 
    Map<String, Operator> map = new HashMap<String, Operator>(); 
    map.put("+", new Plus()); 
    map.put("-", new Minus()); 
    map.put("*", new Multiply()); 
    map.put("/", new Divide()); 
    return map; 
} 

public int compute(int a, int b, String opString) { 
    Operator op = operatorMap.get(opString); 
    if (op == null) 
    throw new IllegalArgumentException("Unknown operator"); 
    return op.compute(a, b); 
} 
+0

¿Por qué 'Integer ... values' si todas las operaciones solo están definidas para dos argumentos? Ant this Sería mucho mejor si fuera un 'enum' (probablemente con una interfaz). – whiskeysierra

+0

usando varargs permite ampliar la aplicación en el futuro, por lo que puede tener operadores adicionales que toman cero, uno, tres argumentos, etc., sin tener que rediseñar todo. De todos modos, fue un ejemplo, es bastante fácil cambiar el diseño para usar solo 2 argumentos. – Lolo

+0

¿De qué sirve usar enumeraciones para implementar operadores enteros? Quiero decir, aparte de la capacidad de usarlos en una declaración de "cambio", ¿qué significa? – Lolo

Cuestiones relacionadas