zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【jQuery】清空表单内容
    【jQuery】remove()和empty()的使用
    【ajax 提交表单】多种方式的注意事项 ,serialize()的使用
    【Gson】互相转化
    yum安装nginx详解
    linux find命令
    nginx实战
    java判断是否为汉字
    分布式存储 CentOS6.5虚拟机环境搭建FastDFS-5.0.5集群(转载)
    Java应用程序实现屏幕的"拍照"
  • 原文地址:https://www.cnblogs.com/pig-brother/p/7398274.html
Copyright © 2011-2022 走看看