С JDK1.6 вы можете использовать встроенный механизм Javascript.
import javax.script.ScriptEngineManager;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
public class Test {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String foo = "40+2";
System.out.println(engine.eval(foo));
}
}
Я думаю, что как бы вы это ни делали, это будет связано с множеством условных операторов. Но для одиночных операций, как в ваших примерах, вы можете ограничить его до 4 операторов if с чем-то вроде
String math = "1+4";
if (math.split("+").length == 2) {
//do calculation
} else if (math.split("-").length == 2) {
//do calculation
} ...
. Это становится намного сложнее, когда вы хотите иметь дело с несколькими операциями, такими как «4 + 5 * 6».
Если вы пытаетесь построить калькулятор, я бы предпочел передавать каждый раздел вычисления отдельно (каждое число или оператор), а не как одну строку.
Правильный способ решить эту проблему - использовать лексер и парсер . Вы можете написать их простые версии сами, или эти страницы также будут иметь ссылки на лексеры и парсеры Java.
Создание парсера с рекурсивным спуском - действительно хорошее учебное упражнение.