【问题标题】:How to split a String text and make a calculation on it in java [duplicate]如何在java中拆分字符串文本并对其进行计算[重复]
【发布时间】:2014-08-22 12:26:59
【问题描述】:

我有一个字符串,例如 str="3+5-4+4+5"; 我可以使用 split() 拆分它;方法,但我怎样才能像这个字符串一样计算超过 2 个数字

【问题讨论】:

  • 你试过System.execute("calc.exe", "3+5-4+4+5");

标签: java


【解决方案1】:

你可以试试这个:

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


String str = "3+5-4+4+5";    
public void myStringCalculation(String str)
{
    ScriptEngineManager x = new ScriptEngineManager();
    ScriptEngine e = x.getEngineByName("JavaScript");
    System.out.println(e.eval(str)); 
}

【讨论】:

  • Interpreter 的包是什么?
  • 我认为您在添加导入语句之后会这样做
  • @Conffusion:- 是的。我补充说,因为我认为它会更清楚:)
  • @RT:你也完全改变了代码。我在您最初的帖子中找不到Interpreter 课程。
  • +1:这可能是使用标准 API 的最短答案。
【解决方案2】:

你可以这样做:

  1. 获取号码
  2. 识别操作员
  3. 按照算子对两个选定的数字进行操作。

【讨论】:

    【解决方案3】:

    看看这个SO link - 有现成的解析器可以解释数学表达式并返回它的结果。

    【讨论】:

      【解决方案4】:

      我假设你想尝试编码。

      您可以使用number operator number 形式的可简化表达式尽可能地简化表达式。

      这里是二元运算符的简单版本,没有大括号,没有负数,只有。

      String[] operators = new String[] {
          "*", "/",
          "+", "-"
      };
      
      String expr = "3+5-4+4+5";
      
      for (;;) {
          boolean reduced = false;
          for (String op : operators) {
              Pattern redex = Pattern.compile("(\\d+)" + Pattern.quote(op) + "(-?\\d+)");
              Matcher m = term.matcher(expr);
              StringBuffer sb = new StringBuffer();
              while (m.find()) {
                  int lhs = Integer.parseInt(m.group(1));
                  int rhs = Integer.parseInt(m.group(2));
                  int y = 0;
                  switch (op) {
                  case "*": y = lhs * rhs; break;
                  case "/": y = lhs / rhs; break;
                  case "+": y = lhs + rhs; break;
                  case "-": y = lhs - rhs; break;
                  default: throw new IllegalStateException("Not implemented: " + op);
                  }
                  m.appendReplacement(sb, String.valueOf(y));
                  reduced = true;
              }
              m.appendTail(sb);
              expr = sb.toString();
          }
          if (!reduced) {
              break;
          }
      }
      

      负数可以与正则表达式中的(负)前瞻/后视一起发挥作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-19
        • 1970-01-01
        • 1970-01-01
        • 2018-08-08
        • 2023-03-23
        相关资源
        最近更新 更多