0

我试图简化这个 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;
}
4

3 回答 3

0

对于这类问题,我认为最优雅的方法是使用多态和枚举类型而不是 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
于 2013-05-23T03:28:35.853 回答
0

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

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

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

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

因为其余的代码是一样的

IE

newResult= newMethod (leftArg, rightArg, operation)

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

于 2013-05-23T02:59:14.077 回答
0

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

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

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

于 2013-05-23T03:18:27.173 回答