JAVA中如何将用户输入的字符串转换成程序行里的代码
比如说提示符下i= ,用户在testfield输入字符串6*6*7
如何转换成程序行里的i=6*7*6
下面的语句是错误的,但是展示了我的意图
String ln= "6*7*6 ";
double i=Double.parseDouble(ln);
想由此得出i的结果
------解决方案--------------------不太可能吧,用户随便输入个命令程序不是就要挂了
------解决方案--------------------如果仅仅是算术表达式 可以这样用一种取巧的方式来解决:
ScriptEngineManager manager=new ScriptEngineManager(); //javax.script.ScriptEngine
ScriptEngine engine=manager.getEngineByName( "JavaScript "); //javax.script.ScriptEngineManager
double i;
try {
i=engine.eval( "6*6*7 ");
} catch (ScriptException e) { //
javax.script.ScriptException return;
}
在JDK1.6的环境下可以得到正确的答案 但是仅限于简单的表达式 其他的 Java是没有提供动态执行的功能的
------解决方案--------------------数据结构里的中缀表达式转后缀表达式!利用堆栈做!
------解决方案--------------------参考:
http://blog.csdn.net/axman/archive/2004/11/04/167002.aspx
public Object eval(String str){
//生成java文件
String s = "class Temp{ ";
s += "Object rt(){ "
s += "MyClass mc = new MyClass(); "
s += " return mc. "+str+ "(); ";
s += "} "
s += "} ";
File f = new File( "Temp.java ");
PrintWriter pw = new PrintWriter(new FileWriter(f));
pw.println(s);
pw.close();
//动态编译
com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main();
String[] cpargs = new String[] { "-d ", "所在目录 ", "Temp.java "};
int status = javac.compile(cpargs);
if(status!=0){
System.out.println( "没有成功编译源文件! ");
return null;
}
//调用Temp的rt方法返回结果:
MyClassLoader mc = new MyClassLoader();
Class clasz = mc.loadClass( "Test.class ",true);
Method rt = clasz.getMethod( "rt ", new Class[]{ String[].class });
return rt.invoke(null, new Object[] { new String[0] });
//如果方法没有返回就直接调用
}
------解决方案--------------------你可以通过使用修改字节码(class文件)的方法来做,如比较简单的javassist等,不过比较复杂。
------解决方案--------------------String ln= "6*7*6 ";
String arr[]=ln.split( "* ").toString();
if(arr.length==3)
double i=Double.parseDouble(arr[0])*Double.parseDouble(arr[1])*Double.parseDouble(arr[2]);
这个i就是你想要的数值
------解决方案--------------------要在 Java 中实现这个功能有点困难的,需要对这个表达式进行字符串分析,因为里面有四则运算的先后顺序、括号的运算优先级别等,一般需要将其转为逆波兰式(后缀)表达式,将其压入栈中,再进行计算的,要实现在运算符越多,其涉及的运算级别就越复杂,实现过程就越烦。
我原来还看到过一个更绝的方法,就可把这个表达式组成 SQL 语句,扔给数据库去执行。
去搜搜“后缀表达式”可以得到很多别人已经做好的示例,可以参考一下。