带有数学运算符的字符串到整数 [重复]

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 谢谢,不客气 :-)

以上是关于带有数学运算符的字符串到整数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

char上的C数学/整数运算[重复]

115-数学运算符 加减乘除求余

shell 学习笔记

shell 学习笔记

shell 学习笔记

在函数php中添加数学运算符[重复]