数学运算符为整数的字符串

我有一个带数学运算符的字符串,我需要把它变成一个int (答案)。

下面的代码不起作用,但我不知道如何让答案变量起作用。

 String question; int answer; question = "7/7+9-9*5/5"; answer = Integer.parseInt(question); 

1. Javascript引擎

 public class MainTest { public static void main(String[] args)throws Exception { ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("js"); Object result = engine.eval("7/7+9-9*5/5"); System.out.println(result); } } 

2. Java编译器

a)将字符串编译为Java类

b)使用自定义ClassLoader加载类。

c)使用reflection来执行它。

这是一个示例:

 import java.io.IOException; import java.lang.reflect.Method; import java.net.URI; import java.util.Arrays; import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.SimpleJavaFileObject; import javax.tools.ToolProvider; public class MainTest{ public static void eval(String str) throws Exception{ StringBuffer sb = new StringBuffer(); sb.append("public class TempClass{\n"); sb.append(" public void run(){\n"); sb.append(" " + str + "\n"); sb.append(" }\n"); sb.append("}\n"); System.out.println(sb.toString()); Class clazz = new EvalClassLoader().findClass(sb.toString()); Method method = clazz.getMethod("run"); method.invoke(clazz.newInstance()); } public static void main(String[] args) throws Exception { eval("System.out.println(7/7+9-9*5/5);"); } } /** * A custom class Loader. */ class EvalClassLoader extends ClassLoader{ private String tempCLassName = "TempClass"; @Override protected Class findClass(String codeStr) throws ClassNotFoundException { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); JavaFileObject file = new ClassFromString(tempCLassName, codeStr.toString()); // Start a compile task Iterable compilationUnits = Arrays.asList(file); JavaCompiler.CompilationTask task = compiler .getTask(null, null, null, null, null, compilationUnits); if(task.call()){ return loadClass(tempCLassName); } return null; } } /** * A Java class constructed from String. */ class ClassFromString extends SimpleJavaFileObject{ private String code; public ClassFromString(String className,String code){ super(URI.create("string:///" + className.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE); this.code = code; } @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) throws IOException { return code; } } 

Integer.parseInt(question); ……如果只是这么简单……

在中缀表示法中有一个数学表达式"7/7+9-9*5/5" 7/7 "7/7+9-9*5/5" ,您想要评估并将结果打印给用户。 这样做的方法是使用Shunting-yard算法将其转换为后缀表示法,也称为反向波兰表示法 。 将表达式转换为postfix后,使用此算法非常容易

你需要像反向波兰表示法这样的东西。 这需要大约一天时间来理解并将算法移植到Java。 绝对可以在Google上搜索代码,但我强烈建议您学习该wiki页面。

由于1.6 Java已经嵌入了JavaScript引擎

  ScriptEngine e = new ScriptEngineManager().getEngineByName("js"); int res = ((Number)e.eval("7/7+9-9*5/5")).intValue(); 

我会让框架和其他库为我做这项工作。 如果这是一个学术性的事情,我建议采用Lai Vung提供的解决方案。 使用将对您进行解析和计算的ScriptManager,然后将输出转换为所需类型。 快速演示:

 import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class Main { public static void main(String[] args) throws ScriptException { String question; int answer; question = "7/7+9-9*5/5"; ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("JavaScript"); answer = ((Number)engine.eval(question)).intValue(); } } 

值得一提:如果android不支持脚本引擎,你可能需要将ScriptEngine库添加到你的路径中。 可以在这里找到解释如何使用Android和Rhino的好文章。