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