2011-01-28 2 views

ответ

12

Я не рекомендую это, но это смешно. в 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); 

пойти с переключателем, но помните, чтобы преобразовать оператор строки СИМВОЛУ как переключатель не работает с струнами еще.

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

lol не знал, что я могу импортировать механизм javascript: D для второго варианта: я знаю, что я мог бы использовать переключатель (или, если ..), мне нужен более «элегантный» метод – dynamic

+0

, вы можете реализовать шаблон интерпретатора, но может быть, слишком много для того, что вы хотите. Где-то есть видеоролик GoogleIO о реорганизации такой проблемы, как ваша. не могу вспомнить имя :( – Mauricio

+0

как вы можете вернуть это: return =; return ||; return +;? – delive

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

Ясно OP не использует полукокс, но вы можете использовать 'op.charAT (0) '. Обязательно проверьте длину. – marcog

+0

В зависимости от ситуации было бы проще использовать символ вместо этого, но я обновил ответ. – 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){ 
} 

(переключатель на струнах) будет разрешено в Java7. Теперь вы можете переключаться с полукокса

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

как упоминалось выше

+0

case '+' для char, вам, вероятно, нужны двойные кавычки! – berry120

2

вы можете попробовать следующий код. Это объектно-ориентированные, весьма общий характер, и вы можете легко расширить его, чтобы добавить новые операторы, в том числе операторов с различным числом аргументов:

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

Почему 'Integer ... values', если все операции определены только для двух аргументов? было бы намного лучше, если бы это было enum (возможно, с интерфейсом). – whiskeysierra

+0

с использованием varargs позволяет расширять приложение в будущем, поэтому вы можете иметь дополнительные операторы, которые принимают нулевой, один, три аргумента и т. Д., Не переделывая все. Во всяком случае, это было предназначено в качестве примера, довольно просто изменить дизайн, чтобы просто использовать 2 аргумента. – Lolo

+0

В чем смысл использования перечислений для реализации целочисленных операторов? Я имею в виду, помимо возможности использовать их в заявлении «switch», что он приносит? – Lolo

Смежные вопросы