Java字符串计算器

我正在尝试用Java创建一个简单的计算器,它以字符串的forms输入并执行简单的“+”和“ – ”操作。

单个数字输入工作,但我的问题是当我尝试实现这个双位数

输入字符串是:5 + 20 + 5 + 11
清单1 = [5,20,2,0,5,11,1]
清单2 = [+,+,+]
答:27

我需要找到一种方法,在list1中存储[5]后如何添加[5,20]而不是当前代码正在执行的[5,20,2,0]。

public int calC(String input) { int len = input.length(); ArrayList list1 = new ArrayList(); ArrayList list2 = new ArrayList(); for (int i = 0; i < len; i++) { if ((input.charAt(i) != '+') && (input.charAt(i) != '-')) { // check if the number is double-digit if ((i + 1 <= len - 1)) { if ((input.charAt(i + 1) != '+')&& (input.charAt(i + 1) != '-')) { String temp = ""; temp = temp + input.charAt(i) + input.charAt(i + 1); int tempToInt = Integer.parseInt(temp); // adding the double digit number list1.add(tempToInt); } // add single digit number list1.add(input.charAt(i) - '0'); } } else { // adding the symbols list2.add(input.charAt(i)); } } int result = 0; result = result + (int) list1.get(0); for (int t = 0; t < list2.size(); t++) { char oper = (char) list2.get(t); if (oper == '+') { result = result + (int) list1.get(t + 1); } else if (oper == '-') { result = result - (int) list1.get(t + 1); } } return result; } 

编辑:工作版
@Ker p pag感谢更新的方法
输入字符串是:5 + 20 + 5 + 11
[5,20,5,11]
[+,+,+]
答:41
我需要尝试使用堆栈按照建议实现它,但当前版本有效

 static boolean isDigit(char check) { if (Character.isDigit(check)) { return true; } return false; } public static int calC(String input) { int len = input.length(); ArrayList list1 = new ArrayList(); ArrayList list2 = new ArrayList(); for (int i = 0; i < len; i++) { if ((i + 1 <= len - 1)) { if (isDigit(input.charAt(i)) && isDigit(input.charAt(i + 1))) { String temp = input.charAt(i) + "" + input.charAt(i + 1); int toInt = Integer.parseInt(temp); list1.add(toInt); i = i+1; } else if (isDigit(input.charAt(i))) { list1.add(input.charAt(i)- '0'); } else { list2.add(input.charAt(i)); } } } int result = 0; result = result + (int) list1.get(0); for (int t = 0; t < list2.size(); t++) { char oper = (char) list2.get(t); if (oper == '+') { result = result + (int) list1.get(t + 1); } else if (oper == '-') { result = result - (int) list1.get(t + 1); } } return result; } 

如果您希望结果41用于输入字符串"5+20+5+11" ,为什么不将ScriptEngineManagerJavaScript引擎一起JavaScript

 public double calC(String input) { int result = 0; ScriptEngineManager mgr = new ScriptEngineManager(); ScriptEngine engine = mgr.getEngineByName("JavaScript"); return (Double)engine.eval(input); } 

但请注意,返回类型在这里是double

如果在这种情况下只想将int作为返回类型,请尝试使用它

 return new BigDecimal(engine.eval(input).toString()).intValue(); 

另一种思考方式:

 public class InlineParsing { public static void main(String []args){ String input = "5-2+20+5+11-10"; input = input.replace(" ",""); String parsedInteger = ""; String operator = ""; int aggregate = 0; for (int i = 0; i < input.length(); i++){ char c = input.charAt(i); if (Character.isDigit(c)) { parsedInteger += c; } if (!Character.isDigit(c) || i == input.length()-1){ int parsed = Integer.parseInt(parsedInteger); if (operator == "") { aggregate = parsed; } else { if (operator.equals("+")) { aggregate += parsed; }else if (operator.equals("-")){ aggregate -= parsed; } } parsedInteger =""; operator = ""+c; } } System.out.println("Sum of " + input+":\r\n" + aggregate); } } 

它基本上是遍历每个char的状态机。

迭代每个字符:

  1. 如果当前char是一个数字,则添加到当前数字缓冲区
  2. 如果当前字符不是数字或我们正在解析最后一位数字
    1. 如果运算符已被解析,则使用该函数将新解析的数字添加到总和中,如果没有解析运算符,则将sum设置为当前解析的数字
    2. 清除当前数字缓冲区
    3. 将当前char存储为运算符

这是代码:

  String a = "5+20-15+8"; System.out.println(a); String operators[]=a.split("[0-9]+"); String operands[]=a.split("[+-]"); int agregate = Integer.parseInt(operands[0]); for(int i=1;i 

我同意堆栈是最好的解决方案,但仍然提供了另一种方法。

  String input = "5+20+11+1"; StringBuilder sb = new StringBuilder(); List list1 = new ArrayList(); List list2 = new ArrayList(); char[] ch = input.toCharArray(); for(int i=0;i 

要将输入存储到列表,您可以尝试使用此代码段

 for (int i = 0; i < input.length() - 1; i++) { // make a method // check if current character is number || check if current // character is number and the next character if (isDigit(input.charAt(i)) && isDigit(input.charAt(i + 1))) { list.add(input.charAt(i) +""+ input.charAt(i + 1)); } else if (isDigit(input.charAt(i))) { list.add(input.charAt(i)); }else{ operator.add(input.charAt(i)); } } //check if it is a number public boolean isDigit(char input){ if(input == '1' || input == '2' || input == '3' || input == '4' || input == '5' || input == '6' || input == '7' || input == '8' || input == '9' || input == '0') return true; return false; } 

我可以建议你使用Exp4j 。 从以下示例代码中可以看出,这很容易理解:

 Expression e = new ExpressionBuilder("3 * sin(y) - 2 / (x - 2)") .variables("x", "y") .build() .setVariable("x", 2.3) .setVariable("y", 3.14); double result = e.evaluate(); 

特别是对于使用更复杂表达的情况,这可能是更好的选择。