Другим решением от ответа J. Сельва'S:
Усовершенствования
- одного класса
- статический блок
- лучше абстракции
импорта java.util.HashMap; импорт java.util.Карта;
/**
* Created by SEA-HAWK on 23/8/15.
*/
public abstract class Expr {
public static Map<String,Object> op;
static{
op=new HashMap<>();
op.put("+", new Expr() {
@Override
public int evaluate(int a, int b) {
return a + b;
}
});
op.put("-", new Expr() {
@Override
public int evaluate(int a, int b) {
return a - b;
}
});
op.put("*", new Expr() {
@Override
public int evaluate(int a, int b) {
return a * b;
}
});
op.put("/", new Expr() {
@Override
public int evaluate(int a, int b) {
return a/b; // decimal point loss
}
});
}
abstract public int evaluate(int a, int b);
public static int exprEval(String expr){
String a[]=expr.split(",");
a[2]=a[2].replaceAll("\"","");
return ((Expr)op.get(a[2])).evaluate(Integer.parseInt(a[0]),Integer.parseInt(a[1]));
}
}
Основная функция:
public static void main(String[] args) {
String x="20,10,\"*\"";
System.out.println(x+"="+Expr.exprEval(x));
x="20,10,\"+\"";
System.out.println(x+"="+Expr.exprEval(x));
x="20,10,\"-\"";
System.out.println(x+"="+Expr.exprEval(x));
x="20,10,\"/\"";
System.out.println(x+"="+Expr.exprEval(x));
}
Выход:
20,10,"*"=200
20,10,"+"=30
20,10,"-"=10
20,10,"/"=2
Примечание: изменение типа данных для поплавка/вычисления десятичного значения.
Вы не можете записывать такие строки, как на Java. Не могли бы вы правильно форматировать строки. –
'Enum.valueOf()' будет стандартной методикой, или поиском карты, или переключателем, но могут ли они избежать вашего состояния-фобии только вы можете сказать. Если у вас есть * фактическое * ограничение какого-либо рода, пожалуйста, сообщите об этом. Возможно, вы ищете стандартного оценщика RPN? Их достаточно просто написать, но не тогда, когда вы указываете произвольные ограничения. – EJP
Искусственные ограничения, подобные этому, звучат ужасно, как домашнее задание. –