有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在字符串中首先计算负数运算

我已经写了我能想到的所有可能的代码组合,但是如果先有一个负运算符,我的计算器就不能工作

计算器的工作方式是,如果已经包含一个运算符(字符串的最后一个字符是数字),它将首先计算已经存在的内容,然后添加已按下的运算符。但是,我希望它允许和第二个运算符当且仅当第一个字符是负数(-symbol)时。但我这辈子不能这么做。这就是我到目前为止所做的:

// calculation logic
    public void calculate() {
            for (int i = 0; i < textField.length(); i++) {
                    checkOp(i);
            }
            resultDisplayed = true;
    }

    public float checkOp(int i) {
            if (textField.getText().charAt(i) == '+') {
                    result = Float.parseFloat(textField.getText().toString().substring(0, i)) + Float.parseFloat(textField.getText().toString().substring(i + 1, textField.length()));
                    returnAnswer(decimalFormat.format(result));
            } else if (textField.getText().charAt(i) == '-') {
                    if (textField.getText().charAt(0) != '-') {
                            result = Float.parseFloat(textField.getText().toString().substring(0, i)) - Float.parseFloat(textField.getText().toString().substring(i + 1, textField.length()));
                    } else {

                    }
            } else if (textField.getText().charAt(i) == '*') {
                    result = Float.parseFloat(textField.getText().toString().substring(0, i)) * Float.parseFloat(textField.getText().toString().substring(i + 1, textField.length()));
                    returnAnswer(decimalFormat.format(result));
            } else if (textField.getText().charAt(i) == '/') {
                    result = Float.parseFloat(textField.getText().toString().substring(0, i)) / Float.parseFloat(textField.getText().toString().substring(i + 1, textField.length()));
                    returnAnswer(decimalFormat.format(result));
            }

            return result;
    }

// checks if last character is one of the operands (not -)
    public void checkLastOp(String op) {
            if (textField.length() == 0 & op.equals("-")) {
                    addToOutput("-");
            } else if (textField.length() > 0) {
                    if (op.equals("+")) {
                            if (textField.getText().toString().contains("+") || textField.getText().toString().contains("-") || textField.getText().toString().contains("*") || textField.getText().toString().contains("/")) {
                                    if (Character.isDigit(textField.getText().charAt(textField.length() - 1)) && textField.getText().charAt(0) != '-') {
                                            calculate();
                                    } else {
                                            if (!Character.isDigit(textField.getText().charAt(textField.length() - 1))) {
                                                    textField.getText().delete(textField.getText().length() - 1, textField.getText().length());
                                            }
                                    }
                            }
                            addToOutput("+");
                    } else if (op.equals("-")) {
                            if (textField.getText().toString().contains("+") || textField.getText().toString().contains("-") || textField.getText().toString().contains("*") || textField.getText().toString().contains("/")) {
                                    if (Character.isDigit(textField.getText().charAt(textField.length() - 1))) {
                                            calculate();
                                    } else if (textField.getText().charAt(textField.length() - 1) == '+' || textField.getText().charAt(textField.length() - 1) == '-') {
                                            textField.getText().delete(textField.getText().length() - 1, textField.getText().length());
                                    }
                            }
                            addToOutput("-");
                    } else if (op.equals("*")) {
                            if (textField.getText().toString().contains("+") || textField.getText().toString().contains("-") || textField.getText().toString().contains("*") || textField.getText().toString().contains("/")) {
                                    if (Character.isDigit(textField.getText().charAt(textField.length() - 1))) {
                                            calculate();
                                    } else {
                                            textField.getText().delete(textField.getText().length() - 1, textField.getText().length());
                                    }
                            }
                            addToOutput("*");
                    } else if (op.equals("/")) {
                            if (textField.getText().toString().contains("+") || textField.getText().toString().contains("-") || textField.getText().toString().contains("*") || textField.getText().toString().contains("/")) {
                                    if (Character.isDigit(textField.getText().charAt(textField.length() - 1))) {
                                            calculate();
                                    } else {
                                            textField.getText().delete(textField.getText().length() - 1, textField.getText().length());
                                    }
                            }
                            addToOutput("/");
                    }
            }
    }

当按下+、-、*、或/并通过方法传递相应的运算符时,将调用CheckLastOp

用我的计算方法,我试着检查-是否是第一个字符,它是否正常进行,是否从第二个值开始计算,并从零减去答案

编辑:我想我已经发现了它崩溃的原因。在我的计算方法中,如果第一个字符是i,我停在0,然后它计算从1到i,从1到0,这是一个完全混乱的过程。现在我需要一种从1到下一个字符的方法,这意味着再次调用calculate,但不确定如何执行此操作

重新编写计算逻辑以进行整理

编辑2:解决了它,更新了我的代码以显示我的解决方案


共 (2) 个答案

  1. # 1 楼答案

    我不明白你为什么需要递归解决方案。在问题陈述中,您说当用户按下第二个运算符时,您首先计算现有表达式,然后添加第二个运算符。应该不需要对checkOp(j)进行递归调用。注:第一个“-”不是运算符,而是表示负数并将其视为负数的符号

    这是因为,除非您试图允许使用括号“[”,“(”,“{”),在这种情况下,表达式的计算要复杂得多

  2. # 2 楼答案

    除了其他评论者强调的小错误之外,我认为我在这里遗漏了一些东西。您试图构建的是一个表达式解析器,它通常是用lexerparser构建的

    如果您尝试自己编写,使用嵌套的ifs,您可能会错过一些关键案例,或者在单元测试中花费大量时间

    这里的好消息是Java默认支持使用JDK1.6+中内置的Javascript引擎进行表达式求值

    以下是一个片段,您可以轻松适应您的情况:

    import javax.script.ScriptEngineManager;
    import javax.script.ScriptEngine;
    
    public class ExpressionEvaluator {
    
      private ExpressionEvaluator instance;
      private ScriptEngineManager scrEngMng;
      private ScriptEngine engine;
    
      private ExpressionEvaluator()
      {
        scrEngMng = new ScriptEngineManager();
        engine = scrEngMng.getEngineByName("JavaScript");
      }
    
      public static ExpressionEvaluator getInstance()
      {
        if(instance == null)
        {
           instance = new ExpressionEvaluator();
        }
        return instance;
      }
    
      public String eval(String expr) throws Exception{    
         return engine.eval(expr).toString();
       } 
    }
    

    用你的表情试试看:

    System.out.println(ExpressionEvaluator.getInstance().eval("your expression here"));
    

    请查看ScriptEngine类,了解如何处理返回值以及如何根据需要修改我的eval函数