1. 程式人生 > >java字符串轉算術表達式(進階篇)

java字符串轉算術表達式(進階篇)

rri math .cn eth 來看 style override 算術 ger

今天我們要將前兩篇的隨筆總結一下,用面向對象的思想封裝一下,使它能夠更容易的擴展。

首先我們要設計一個類,讓他能夠同時表示操作符和操作數

技術分享

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

java字符串轉算術表達式(進階篇)