代码改变世界

java字符串转算术表达式(进阶篇)

2017-08-19 23:04  猪牙哥  阅读(8537)  评论(0编辑  收藏  举报

今天我们要将前两篇的随笔总结一下,用面向对象的思想封装一下,使它能够更容易的扩展。 

首先我们要设计一个类,让他能够同时表示操作符和操作数

public enum OperationType {
    /**
     * 操作值
     */
    VALUE,
    /**
     * 操作符
     */
    SYMBOL;

}

这里的操作数不是我们设计的问题所在,主要是操作符,我们操作符设计成这样

flag():操作符的指定标识

priority():操作符的优先级

numOfSymbol():需要参与运算的操作数个数

operation():将结果封装成Operation

cal():计算结果

示例代码:

/**
 * 加号操作符
 * 
 * @author sbtufss
 * 
 */
public class PlusSymbol extends Symbol {
    @Override
    public String flag() {
        return "+";
    }

    @Override
    public SymbolPriority priority() {
        return SymbolPriority.PLUS;
    }

    @Override
    public int numOfSymbol() {
        return 2;
    }

    @Override
    public double cal(double[] values) {
        // TODO Auto-generated method stub
        return values[0] + values[1];
    }

}

而,到了这一步,我们还需要一个操作符管理器,来告诉表达式,我能处理那些操作符

然后我们来看一下他的子类CommonSymbolManager.java

/**
 * 管理操作符字符串所对应的操作符类
 * 
 * @author sbtufss
 * 
 */
public class CommonSymbolManager extends SymbolManager {

    public CommonSymbolManager() {
        super();
        list.add(new PlusSymbol());
        list.add(new ReduceSymbol());
        list.add(new MultSymbol());
        list.add(new DivideSymbol());
    }
}

这个类默认添加了加减乘除这四个操作符,而我们要添加自己自定义的操作符时,应该怎么办呢?

实际上我们只需要在处理字符串表达式之前来添加进去就行了,ok,上代码

public static void main(String[] args) {
        Calculator calculator = new Calculator();
        calculator.getSymbolManager().add(new MathPowSymbol());//添加自定义的操作符
        calculator.handleStr("(2+3.2)+Math.pow(3,2)*(40-5+(-1)*4)");
    }

运行结果

 相关源码在github上面:

git地址https://github.com/sbtufss/calculate.git