【问题标题】:Simplify this if statement in JAVA [duplicate]在JAVA中简化这个if语句[重复]
【发布时间】:2013-05-23 02:47:01
【问题描述】:

我试图简化这个 if 语句以避免代码重复和 if 语句。我还希望能够传递超过 2 个参数。即 5+10*2/2。有什么想法吗?

public static double randomExpressionDraft(String exp) {
    double primeResult = 0;
    double newResult = 0;
    for (int i = 0; i < exp.length(); i++) {
        if (exp.charAt(i) == '*') {
            newResult = Integer.parseInt(exp.substring(0, i)) * Integer.parseInt(exp.substring(i + 1, exp.length()));
            primeResult = newResult;
            System.out.println(primeResult);
        } else if (exp.charAt(i) == '/') {
            newResult = Integer.parseInt(exp.substring(0, i)) / Integer.parseInt(exp.substring(i + 1, exp.length()));
            primeResult = newResult;
            System.out.println(primeResult);
        } else if (exp.charAt(i) == '+') {
            newResult = Integer.parseInt(exp.substring(0, i)) + Integer.parseInt(exp.substring(i + 1, exp.length()));
            primeResult = newResult;
            System.out.println(primeResult);
        } else if (exp.charAt(i) == '-') {
            newResult = Integer.parseInt(exp.substring(0, i)) - Integer.parseInt(exp.substring(i + 1, exp.length()));
            primeResult = newResult;
            System.out.println(primeResult);
        }
    }
    return primeResult;
}

【问题讨论】:

  • 一种更好的方法是使用 switch,不带中断,默认使用两个语句,即 primeResult = newResult;和 System.out.println(primeResult);
  • 您的代码也不会评估为正确答案,因为您没有首先考虑 *, /
  • 不要因为您不喜欢答案而重新发布相同的问题。编辑原始问题。

标签: java if-statement for-loop expression


【解决方案1】:

你的循环应该得到*/-+的操作

Integer.parseInt(exp.substring(0, i)) 移动到一个函数,例如getLeftArg

Integer.parseInt(exp.substring(i+1, exp.length())); 执行相同操作,例如getRightArg

然后使用参数leftArg,rightArg,操作创建新方法

其余代码相同

newResult= newMethod (leftArg, rightArg, operation)

你的计算加上primeResult = newResult; System.out.println(primeResult);

【讨论】:

    【解决方案2】:

    由于 Java 没有委托之类的东西,因此除非您在 Object 中定义每个运算符,否则您将无法像您希望的那样实现循环。如果您想要最简单的代码,这是 Mauricio 来自similar question 的解决方案:

    ScriptEngineManager scm = new ScriptEngineManager();
    ScriptEngine jsEngine = scm.getEngineByName("JavaScript");
    double primeResult = (double)jsEngine.eval(exp);
    

    是的,让 JavaScript 引擎评估算术表达式有点过头了。但是,它显然可以处理多个运算符,因此您不必自己解析它。

    【讨论】:

      【解决方案3】:

      对于这类问题,我认为最优雅的方法是使用多态性和枚举类型而不是 switch 语句。

      以下代码来自 Effective Java - 第 6 章,Joshua Bloch。

      public enum Operation {
          PLUS("+") {
              double apply(double x, double y) { return x + y; }
          },
          MINUS("-") {
              double apply(double x, double y) { return x - y; }
          };
          private final String symbol;
          Operation(String symbol) { this.symbol = symbol; }
          @Override public String toString() { return symbol; }
      
          abstract double apply(double x, double y);
      
          private static final Map<String, Operation> stringToEnum = new HashMap<>();
          static {
              for(Operation op : values())
                  stringToEnum.put(op.toString(), op);
          }
          public static Operation fromString(String symbol) {
              return stringToEnum.get(symbol);
          }
      }
      

      然后,应用一个操作:

       double result = Operation.fromString("+").apply(1, 1); // 2.0
       result = Operation.fromString("-").apply(1,1); // 0.0
      

      【讨论】:

        猜你喜欢
        • 2017-04-11
        • 1970-01-01
        • 1970-01-01
        • 2019-10-06
        • 1970-01-01
        • 1970-01-01
        • 2022-08-10
        • 2018-10-14
        • 1970-01-01
        相关资源
        最近更新 更多