2011-01-28 12 views

risposta

12

Non consiglio questo, ma è divertente. in 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); 

andare con l'interruttore, ma ricordate di convertire l'operatore stringa char come interruttore non fanno lavori con le stringhe ancora.

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

lol non sapeva che potresti importare il motore javascript: D per la seconda opzione: so perfettamente che potrei usare un interruttore (o un if ...) volevo un metodo più "elegante" – dynamic

+0

puoi implementare un pattern Interpreter ma forse è eccessivo per quello che vuoi. C'è un video di GoogleIO da qualche parte sul refactoring di un problema come il tuo. non riesco a ricordare il nome :( – Mauricio

+0

come si può restituire questo: return =; return ||; return +;? – delive

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

Chiaramente OP non utilizza un carattere, ma è possibile utilizzare 'op.charAT (0) '. Assicurati di controllare la lunghezza. – marcog

+0

A seconda della situazione, potrebbe essere più semplice usare un carattere, ma ho aggiornato la risposta. – 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){ 
} 

(interruttore su stringhe) sarà consentito in Java7. Ora è possibile passare con char

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

come detto sopra

+0

case '+' è per un carattere, probabilmente si desidera racchiudere tra virgolette doppie! – berry120

2

si può provare il seguente codice. E 'object oriented, piuttosto generica, e si può facilmente estendere per aggiungere nuovi operatori, compresi gli operatori con un diverso numero di argomenti:

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

Perché "Integer ... values" se tutte le operazioni sono definite solo per due argomenti? sarebbe molto più bello se fosse un 'enum' (probabilmente con un'interfaccia). – whiskeysierra

+0

utilizzando varargs consente di estendere l'applicazione in futuro, in modo da poter disporre di operatori aggiuntivi che accettano zero, uno, tre argomenti, ecc ..., senza dover riprogettare tutto. Ad ogni modo, è stato inteso come un esempio, è abbastanza facile cambiare il design per usare solo 2 argomenti. – Lolo

+0

Qual è il punto di utilizzo dell'enumerazione per implementare gli operatori di numeri interi? Voglio dire, a parte la possibilità di usarli in una dichiarazione "switch", cosa porta? – Lolo

Problemi correlati