方程式解析错误(java)
我有以下代码:方程式解析错误(java),java,equation,Java,Equation,我有以下代码: public class Parse { static double eval(String exp) { ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("JavaScript"); String stringResult = null; try {
public class Parse {
static double eval(String exp) {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String stringResult = null;
try {
ArrayList<Variable> vars = askForVars(parse1(exp));
ArrayList<String> usednames = new ArrayList<String>();
for (Variable v : vars) {
if (!usednames.contains(v.name)) {
stringResult = replaceString(exp, v.name, "" + v.valueUsed);
usednames.add(v.name);
}
return Double.parseDouble(engine.eval(stringResult.toString())
.toString());
}
} catch (Exception ex) {
ex.printStackTrace();
}
return 0.0;
}
static ArrayList<Variable> parse1(String exp) {
ArrayList<Variable> variables = new ArrayList<Variable>();
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
String stringResult;
try {
stringResult = exp;
for (Character c : stringResult.toCharArray()) {
if (c.isLetter(c)) {
variables.add(new Variable(c.toString(), 1.0));
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return variables;
}
static ArrayList<Variable> askForVars(ArrayList<Variable> as) {
ArrayList<Variable> result = new ArrayList<Variable>();
ArrayList<String> usednames = new ArrayList<String>();
for (Variable v : as) {
if (!usednames.contains(v.name)) {
System.out.print("Value of " + v.name + ": ");
Double input = Double.parseDouble(MessageUtil.getInput());
result.add(new Variable(v.name, input));
usednames.add(v.name);
}
}
return result;
}
static String replaceString(String s, String from, String to) {
return s.replaceAll(from, to);
}
}
公共类解析{
静态双值(字符串扩展){
ScriptEngineManager mgr=新建ScriptEngineManager();
ScriptEngine=mgr.getEngineByName(“JavaScript”);
字符串stringResult=null;
试一试{
ArrayList vars=askForVars(parse1(exp));
ArrayList usednames=新的ArrayList();
for(变量v:vars){
如果(!usednames.contains(v.name)){
stringResult=replaceString(exp,v.name,“+v.valueUsed);
使用名称。添加(v.名称);
}
返回Double.parseDouble(engine.eval(stringResult.toString())
.toString());
}
}捕获(例外情况除外){
例如printStackTrace();
}
返回0.0;
}
静态ArrayList parse1(字符串exp){
ArrayList变量=新的ArrayList();
ScriptEngineManager mgr=新建ScriptEngineManager();
ScriptEngine=mgr.getEngineByName(“JavaScript”);
字符串字符串结果;
试一试{
stringResult=exp;
for(字符c:stringResult.toCharArray()){
如果(c.c)){
添加(新变量(c.toString(),1.0));
}
}
}捕获(例外情况除外){
例如printStackTrace();
}
返回变量;
}
静态ArrayList askForVars(ArrayList as){
ArrayList结果=新建ArrayList();
ArrayList usednames=新的ArrayList();
for(变量v:as){
如果(!usednames.contains(v.name)){
系统输出打印(“值“+v.name+”:”);
Double-input=Double.parseDouble(MessageUtil.getInput());
添加(新变量(v.name,input));
使用名称。添加(v.名称);
}
}
返回结果;
}
静态字符串替换字符串(字符串s、字符串from、字符串to){
返回s.replaceAll(从,到);
}
}
当我只有一个变量(例如:2x、3x+2x等)时,这是可以的,但当我使用多个变量(例如:x+y、3x-3y等)时,问题就出现了
这就是错误:
x:3的值y:4 javax.script.ScriptException:sun.org.mozilla.javascript.internal.EcmaError:ReferenceError:y未定义。(#1)在com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:156)在com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:170)在javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)在com.company.Parse.eval(Parse.java:24)在com.company.MessageUtil.createExp的第1行com.company.Main.Main(Main.java:28)上的(MessageUtil.java:97)x+y解析为:0.0
更复杂的代码到底发生了什么?
x:3的值y:4的值javax.script.ScriptException:sun.org.mozilla.javascript.internal.EcmaError:ReferenceError:“y”没有定义。(#1)在com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:156)的第1行com.company.Parse.eval(Parse.java:24)com.company.MessageUtil.createExp(MessageUtil.java:97)com.company.Main.Main(Main.java:28)x+y解析为:0.0