在JAVA中简化此if语句

时间:2013-05-23 02:47:01

标签: java if-statement for-loop expression

我正在尝试简化此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;
    }

3 个答案:

答案 0 :(得分:0)

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

Integer.parseInt(exp.substring(0, i))移至某个功能,例如getLeftArg

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

然后使用params leftArg,rightArg,operation

创建新方法

代码的其余部分是相同的

即。

newResult= newMethod (leftArg, rightArg, operation)

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分: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