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

时间: 2024-12-19 18:39:54

java字符串转算术表达式(进阶篇)的相关文章

java实现计算算术表达式的值(后缀表达式方式)

Java代码   package zn.sd.ly.jtree.test; /** * 表达式 * * @author 风华褚胜--刘胜军 */ import java.util.Arrays; import java.util.Scanner; import java.util.Stack; public class Four { @SuppressWarnings("resource") public static void main(String[] args) { Scanne

[java]输入一个算术表达式输出结果

动手有益. 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形.例如:  输入:3+8×2/9-2  输出:2 /** * input a calculate string, calcuate the value * the number between 0-9 * round the middle vlaue to int * */ public static void main(String[] args) { //8*6+2-6/3*6+2 String c

零基础写Java知乎爬虫之进阶篇

说到爬虫,使用Java本身自带的URLConnection可以实现一些基本的抓取页面的功能,但是对于一些比较高级的功能,比如重定向的处理,HTML标记的去除,仅仅使用URLConnection还是不够的. 在这里我们可以使用HttpClient这个第三方jar包. 接下来我们使用HttpClient简单的写一个爬去百度的Demo: 1 import java.io.FileOutputStream; 2 import java.io.InputStream; 3 import java.io.O

Java应用基础微专业-进阶篇

第1章--使用对象 1.1 字符类型 char c = 65; // char --> int char c = '\u0041'; // \u: unicode + (Hex 41--> Dec 65) char c = 'A';

java web进阶篇(三) 表达式语言

表达式语言(Expression Language ,EL)是jsp2.0中新增的功能.可以避免出现许多的Scriptlet代码 格式: ${ 属性名称 },  使用表达式语言可以方便的访问对象中的属性,提交的参数或者进行各种数学运算,而且使用表达式语言最大的特点是如果输出的内容是null,则会自动使用空字符串("")表示. <%request.setAttribute("name", "info");%> <h1>${n

Java快速教程--vamei 学习笔记(进阶篇)

感谢vamei,学习链接:http://www.cnblogs.com/vamei/archive/2013/03/31/2991531.html Java进阶01 String类 学习链接:http://www.cnblogs.com/vamei/archive/2013/04/08/3000914.html 字符串操作 ---------------------------------------------------------------------------------------

java实现算术表达式求值

需要根据配置的表达式(例如:5+12*(3+5)/7.0)计算出相应的结果,因此使用java中的栈利用后缀表达式的方式实现该工具类. 后缀表达式就是将操作符放在操作数的后面展示的方式,例如:3+2 后缀表达式为32+,3*(2+1)的后缀表达式为:321+*,解决表达式求值首先需要根据字符串表达式求出后缀表达式,然后使用后缀表达式和操作数栈实现计算,计算的大致思想是从后缀表达式中取元素,如果元素是数值则加入到操作数栈中,如果是运算符则从操作数栈中取两个数来参与运算.后缀表达式的获取要借助于两个栈

java web进阶篇(四) Tomcat数据源

动态web开发的最大特点是可以进行数据库的操作,传统的jdbc操作由于步骤重复性造成程序性能下降. 先来回顾JDBC的操作原理 1.加载数据库驱动程序,数据库驱动程序通过classpath配置. 2.通过DirverManager类取得数据库连接对象. 3.通过Connection实例化PreparedStatement对象,编写sql语句命令操作数据库. 4.数据库属于资源操作,操作完成后要关闭数据库以释放资源. 其实以上操作,1.2.4步骤是重复的,保留3,实际上就是数据源产生的原因. 数据

java集合框架小结(进阶版)之HashMap篇

基本概念: Hash(哈希):hash一般也译作“散列”.事实上,就是一个函数,用于直接定址.将数据元素的关键字key作为变量,通过哈希函数,计算生成该元素的存储地址. 冲突:函数是可以多对一的.即:多个自变量可以映射到同一函数值.一般而言,不同的key的hash值是不同的.在往hash表中映射的时候,不同的hash值可能映射到同一存储地址,这种情况被称为冲突. 解决冲突的方法: 1. 链表法:将冲突的各个元素用一个一维数组来维护.(java源码实现) 2. 开发寻址法:具体的有线性探测法.二次