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


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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM