Java 我想在字符串中执行多个数学运算

Java 我想在字符串中执行多个数学运算,java,android,string,Java,Android,String,预期产出为:16 算法应该识别操作符(+、-、*、/),然后在给定的数字之间逐个进行操作作为输入 我最初创建了一个字符串数组 string input = "12+5-1"; 然而,有人告诉我,这样做效率很低,因为字符串已经是字符数组了。我需要这个逻辑的帮助 编辑: 顺便说一句,我正在尝试制作一个科学计算器。你可以使用内置的javascript引擎来实现这一点 string[] strArrInput = input; 我用stack做了一个简单的代码,看看这个 import ja

预期产出为:16

算法应该识别操作符(+、-、*、/),然后在给定的数字之间逐个进行操作作为输入

我最初创建了一个字符串数组

 string input = "12+5-1";
然而,有人告诉我,这样做效率很低,因为字符串已经是字符数组了。我需要这个逻辑的帮助

编辑:


顺便说一句,我正在尝试制作一个科学计算器。你可以使用内置的javascript引擎来实现这一点

string[] strArrInput = input;

我用stack做了一个简单的代码,看看这个

    import javax.script.ScriptEngine;
    import javax.script.ScriptEngineManager;
    import javax.script.ScriptException;

    public class Test {
        public static void main(String[] args) throws ScriptException {
            ScriptEngineManager mgr = new ScriptEngineManager();
            ScriptEngine scriptEngine = mgr.getEngineByName("JavaScript");
            String expression = "12+5-1";
            System.out.println(scriptEngine.eval(expression));

        }
    }
import java.util.Scanner;
导入java.util.Stack;
公共课评价{
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
字符串输入=sc.next();
堆栈算子;
堆栈操作数;
操作数=新堆栈();
运算符=新堆栈();
int res=0,c;
对于(int i=0;i1;){
a=操作数.pop();
b=操作数.pop();
op=operator.pop();
push(结果(a,b,op));
}
System.out.println(操作数);
}
公共静态布尔等运算符(int c){
返回c='+'| c='-'| c='*'.'| c=='\';
}
公共静态整数结果(整数a、整数b、字符c){
如果(c=='+')
返回a+b;
如果(c=='-')
返回b-a;
如果(c=='*')
返回a*b;
其他的
返回b/a;
}
}

您可以这样使用,我还没有实现操作数优先级,但我认为您现在可以这样做。

您可以使用givn字符串函数解析字符串。(indexOf,lastOf,split)但是写一个懂数学的阿尔戈人并不是那么容易。 我做过一次(没有“()”),但是没有代码给你。8[ 我告诉你我做了什么:

我首先搜索“*,/” 乙二醇

在givn索引处拆分字符串

input=120-20*2+30;
在左侧分割处,我搜索最后一个+,-在右侧搜索第一个 再次将其拆分为givn索引 (左静止=120;右静止=30)

现在,我将左侧找到的值-20解析为BigDecimal(因为这将为逗号值提供更好的结果),并将右侧找到的值解析为BigDecimal 2 现在你可以计算了

left=120-20; 
right=2+30;
将该值写回字符串,如果calcValue不为负,则必须先写a+,这样做可以:

calcValue=-40=-20 * 2;
这给了你:

if(calcValue>0){
 setPlus="+";
}else{
 setPlus="";
}

input=leftRest+setPlus+Value+rightRest;
现在你重复直到没有*/ 然后你开始搜索+-

如果你用bigDecimal除掉某个东西,你必须说出你想要多少个逗号值……否则它会抛出一个1/3的例外

如果你想用“()”来做,你必须先在“(”,“)”处拆分字符串,然后在其中做数学运算,然后写回不带“()”的字符串

希望我能帮你一点忙,我想还有其他的方法可以做到,但我只需要6小时,完全醉了才写这段代码^^


Stefan

提出正确的问题,并向我们展示您迄今为止所做的工作!效率真的是问题所在吗?如果不是,您应该关注最优雅的解决方案。您可以将此
字符串
解析为javascript脚本(双关语)并使用rhino或
ScriptEngine
等javascript引擎来执行它。相关:查看无法解析符号ScriptEngine
if(calcValue>0){
 setPlus="+";
}else{
 setPlus="";
}

input=leftRest+setPlus+Value+rightRest;
 120-40+30