带有数学运算符的字符串到整数 [重复]
Posted
技术标签:
【中文标题】带有数学运算符的字符串到整数 [重复]【英文标题】:String with math operators to Integer [duplicate] 【发布时间】:2013-02-16 21:29:41 【问题描述】:我有一个带有数学运算符的字符串,我需要将其转换为 int
(答案)。
以下代码不起作用,但我不确定如何使 answer 变量起作用。
String question;
int answer;
question = "7/7+9-9*5/5";
answer = Integer.parseInt(question);
【问题讨论】:
@Photon 我想要计算结果。 跟随别人的答案太容易了 如果您正在学习如何完成计算而不是使用反向波兰符号,如果您只是对结果感兴趣而不是使用 Scriptengine @A4L 我现在只对结果感兴趣,但我不相信 android SDK 原生支持 ScriptEngine。 @Kristian Matthews,看看这个问题***.com/questions/10704885/… ...恐怕你必须找到一些第 3 方 api 或者自己编写算法 【参考方案1】:Integer.parseInt(question);
...要是这么简单就好了...
您在infix notation 中有一个数学表达式"7/7+9-9*5/5"
,您希望对其进行评估并将结果打印给用户。这样做的方法是使用Shunting-yard algorithm 将其转换为postfix notation also known as Reverse Polish notation。将表达式转换为后缀评估后,使用此 algorithm
【讨论】:
【参考方案2】: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) 使用反射执行它。
这是一个示例:
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<JavaFileObject> 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;
【讨论】:
您能否为第二种解决方案发布一些代码。我不确定我知道如何做到这一点。 10q 谢谢,同时我也想通了。不错【参考方案3】:我会让框架和其他库为我完成工作。如果这是学术问题,我建议使用 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 不提供对 Script 引擎的支持,您可能必须将 ScriptEngine 库添加到您的路径中。可以在here找到一篇解释如何使用 Android 和 Rhino 的好帖子。
【讨论】:
【参考方案4】:从 1.6 开始,Java 已经嵌入了 JavaScript 引擎
ScriptEngine e = new ScriptEngineManager().getEngineByName("js");
int res = ((Number)e.eval("7/7+9-9*5/5")).intValue();
【讨论】:
android 应用程序是否原生支持 javax? 不,不是。我在回复中添加了一些信息。【参考方案5】:你需要像Reverse Polish notation 这样的东西。理解该算法并将其移植到 Java 大约需要一天的时间。当然,您可以在 Google 上搜索代码,但我强烈建议您学习该 wiki 页面。
【讨论】:
@ig0774 当然它回答了这个问题。 @LaiVung 这似乎是最好的方法,但不幸的是,对于这个项目,我没有时间确切地了解它是如何工作的,所以我必须保存阅读以备后用.谢谢。 @KristianMatthews 谢谢,不客气 :-)以上是关于带有数学运算符的字符串到整数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章