- 浏览: 114534 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
HuoYun:
兄弟,这个代码对于其他excel转换会出问题,如数据库导出的e ...
excel文件转换为pdf文件的问题总结 -
listen-raining:
这两天正在弄这个东东
excel文件转换为pdf文件的问题总结 -
李001:
你是英雄!
excel文件转换为pdf文件的问题总结 -
237304457:
少文,功 能有全事例不,
excel文件转换为pdf文件的问题总结 -
237304457:
提供大资源是哪种方式呀?
excel文件转换为pdf文件的问题总结
数学表达式解析工具类:
支持负数运算,
多层括号嵌套运算
采用堆栈实现,实现步骤:
(1)除去表达式中所有空白
(2)提取表达式运算符合
(3)依据运算符合,将表达式转化为一个数组
(4)对这个数组进行数学运算优先级转化,生成一个新数组的
(5)最后对这个数组进行运算,得到结果
注:具体算法细节请查看代码。
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package autotest.entity; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Stack; import java.util.regex.Pattern; import autotest.util.StringUtils; /** * 支持加减乘法运算 * @author Administrator */ public class ExpressionResolver { private final static Map<String,Integer> SERT=new HashMap<String,Integer>(); static{ SERT.put("+", 1); SERT.put("-", 1); SERT.put("*", 2); SERT.put("/", 2); SERT.put("(", 3); SERT.put(")", 3); } /** * 转换有负号表达式-3+2 转换为 (0-3)+2 * 2-3不转 * (-3)+2 ==>((0-3))+2 * @param exp * @return */ private static String transfrom(String exp){ exp=StringUtils.trimAllSpace(exp); return exp.replaceAll("(\\(|^)-(\\d*)", "$1(0-$2)"); } /** * 解析表达式 * @param exp * @return */ private static List<String> resolveExpr(String exp){ String opert=exp.replaceAll("\\d*", ""); List<String> list=new ArrayList<String>(); int pidx=-1; for(int i=0;i<opert.length();i++){ String p=opert.substring(i, i+1); pidx=exp.indexOf(p); if(exp.substring(0,pidx).trim().length()!=0){ list.add(exp.substring(0, pidx)); } list.add(exp.substring(pidx, pidx+1)); exp=exp.substring(pidx+1); } if(exp.length()>0){ list.add(exp); } return list; } /** * 转为计算机可以识别的表达式 * @param list * @return */ private static String[] transfrom(List<String> list){ Stack<Sign> op=new Stack<Sign>(); Stack<String> data=new Stack<String>(); Iterator<String> it=list.iterator(); int p1=0,p2=0,add=0; while(it.hasNext()){ String e=it.next(); if(SERT.containsKey(e)){ if(op.size()>0){ p1=op.peek().getWeight(); } p2=SERT.get(e)+add; if(e.equals("(")){ add+=SERT.get(e); continue; } if(e.equals(")")){ add-=SERT.get(e); continue; } while(p2<=p1){ data.push(op.pop().getSign()); if(op.size()==0){ break; } p1=op.peek().getWeight(); } op.push(new Sign(e,p2)); }else{ data.push(e); } } while(op.size()>0){ data.push(op.pop().getSign()); } String[] result=new String[data.size()]; for(int i=0;i<result.length;i++){ result[result.length-i-1]=data.pop(); } return result; } /** * 计算表达式值 * @param exp * @param duckSqls * @return */ public static Object getExp(String exp,List<DuckSQL> duckSqls)throws Exception{ // if(!StringUtils.isValidateStr(exp) || duckSqls==null || duckSqls.size()<=0){ // return null; // } exp=transfrom(exp); String[] strs=transfrom(resolveExpr(exp)); Stack<Object> expstack=new Stack<Object>(); for(int i=0;i<strs.length;i++){ String str=strs[i]; if(SERT.containsKey(str)){ expstack.push(calc(expstack.pop(),expstack.pop(),str,duckSqls)); }else{ expstack.push(str); } } if(expstack.size()==1){ return expstack.pop(); }else{ return "ERR"; } } /** * 计算结果 * @param s1 * @param s2 * @param op * @return */ private static Object calc(Object s1,Object s2,String op,List<DuckSQL> duckSqls)throws Exception{ Double d1=null,d2=null; if(s1 instanceof String){ d1=Double.parseDouble((String)s1);//getValue((String)s1,duckSqls); }else{ d1=(Double)s1;; } if(s2 instanceof String){ d2=Double.parseDouble((String)s2);; }else{ d2=(Double)s2; } if(op.equals("-")){ return d2-d1; }else if(op.equals("+")){ return d2+d1; }else if(op.equals("*")){ return d2*d1; }else if(op.equals("/")){ return d2/d1; }else{ throw new Exception("表达式中运算符["+op+"]是不合法的"); } } private static Double getValue(String str,List<DuckSQL> duckSqls)throws Exception{ if(!Pattern.matches("\\d{2}", str)){ throw new Exception("表达式中含有不合法的式子["+str+"]"); } Object obj = duckSqls.get(Integer.parseInt(str.substring(0, 1))-1).getRsdata()[Integer.parseInt(str.substring(1, 2))-1]; if(obj instanceof Number){ return ((Number)obj).doubleValue(); }else{ throw new Exception("["+str+"]式子对应结果不是数据类型不可以加减乘法运算"); } } public static void main(String[] args)throws Exception{ // List<String> list=resolveExpr("(12+13)*14+15"); // // String[] strs=transfrom(list); // for(String str:strs){ // System.out.println(str); // } System.out.println(getExp("-3+2*(-5)+6+(-4)*7*(-9)*(2-3)",null)); // System.out.println("-3+2*(-5)+6+(-4)*7*(-9)*(2-3)".replaceAll("(\\(|^)-(\\d*)", "$1(0-$2)")); } }
发表评论
-
java代码模拟计算机实现原理(一)加法器模拟
2011-09-29 23:30 3258加法器是有两种基本逻辑门电路:异或门、与门电路组成的 ... -
jar 命令简介
2011-02-16 09:55 1178jar 命令用途:采用zip和ZLIB的压缩格式,将一系列程序 ... -
javac 命令
2011-02-16 09:17 1308最简单的方式(javac -d)首先,需要编译JAVA文件,需 ... -
阿拉伯数组转换成对应中文
2011-02-12 11:52 1117package com.heda.code; publi ... -
java二叉树实现
2011-02-12 11:50 1034package com.heda.code; publi ... -
最大公约数和最小公倍数
2011-02-12 11:48 997package com.heda.code; publi ... -
比较完整数据源实现
2010-06-12 21:35 1437package com.bpsoft.bl ... -
jxl 操作excel Demo
2010-05-25 16:02 1313程序是用:jxl技术来操作excel文档的,实现了excel插 ... -
Jacob操作Word详细教程
2010-05-11 21:16 5396首先, ... -
Java 正则表达式小结
2010-05-11 20:25 1467Java 中正则表达式是在Java 1.4版本以后才出现的。在 ... -
DOM写的xml工具类
2010-04-05 16:15 1367package xml_util; import j ... -
日志记录器
2010-03-12 23:12 959package log_util; import jav ... -
java1.5新特性枚举实现原理
2010-03-09 00:24 1116package com.bp_soft.day01; /** ... -
Struts 1实现原理之我理解
2010-03-06 23:23 1465Struts是在servlet基础上设计的一种框架。下面看一段 ... -
JDBC模板类实现(version1.1)
2010-01-30 14:34 1344package daoUtil.daoTemplate; ... -
BeanUtils.copyProperties(son, father)使用感想
2010-01-28 12:20 3154BeanUtils.copyProperties(son, f ... -
jdbc数据源
2010-01-20 19:06 1052数据源设计思想和数据库连接池设计思想基本相似。大家知道在操作数 ... -
经典JDBC DAOFactory类实现
2010-01-09 23:02 2407package ajax.user.language.fact ... -
WEB应用中常用的数据库连接池
2009-12-26 16:07 1348数据库连接池是WEB应用中必不可少的东西,这是我个人最近参照别 ... -
非常好获得数据库连接工具类
2009-12-26 15:58 1775这是一个写的非常好的获得数据库连接工具类,里面提供常用数据库驱 ...
相关推荐
可以支持复杂的数学表达式(常量、变量、带括号)的计算 如123 + (a * 456)/c - (d + 789) 输入变量值,展示计算步骤和结果 目前支持+ - * / 幂 cos等操作 操作符可方便扩展
数学表达式解析器java语言描述,源代码在jar文件包里面,运行环境JDK1.6 u17以上.
一个简易的计算器 用java写的 利用递归解析表达式运算出结果 附带实验报告
代码均为自己设计所写,分享一下。 字符串数学表达式(含括号)计算值 如: "31+3*3-20/2*5+40/8+4*5" ((2*(19-13*(1+2)/39)/6+4)-5)/5+((2+3)*2-5)
Java表达式语法解析库 parboiled
前几天要做一个计算数学表达式的题目,本来计划使用解析表达式的方法来解析各种数学表达式,然后再动态计算表达式的值.后来考虑到这样编程的任务很重,时间有限 后来在网上搜搜,看到使用动态编译并使用反射机制 ,这样...
java正则实现解析算术表达式 (仅限+-*/和括号)
Java计算数学表达式的结果的jar包(bsh-2.0b4.jar) Java计算数学表达式的结果的jar包(bsh-2.0b4.jar)
字符串类型的数学表达式 不用解析 直接得出结果 public class IllegalExpressionException extends RuntimeException { private static final long serialVersionUID = 7941685726759058059L; public ...
用几行代码,CalM使您的应用程序可以评估用户提供的数学表达式,例如“ e ^(sin .25pi)”和“(sqrt e)^(sqrt 2)”。 解析器的标准配置具有多种数学运算,包括基本算术,三角函数,组合函数,线性代数等。 ...
Java 表达式是一个开源库,可以解析如下表达式: (1) 简单的例子是 1+1 (2) 复杂的例子可以很复杂: Add(3, Subtract(4,1), 3) / 3 * Square(3) * Multiply(3, Add(2, Subtract(2,1)))== 243 (3) 您可以将对象...
数学表达式解析器4 Java MEP4J是用于Java的高性能数学表达式字符串解析器(J2SE> = 5)。 将其与同类库的性能进行比较,并让我知道您的经验。 该库管理5个运算符(+,-,/,%,*)以及以下功能:-“ abs”-“ cos”...
NULL 博文链接:https://wuniu2010.iteye.com/blog/1544253
解析数学表达式; 评估数学表达式; 从中缀转换为后缀表示法; 以后缀表示法计算表达式; 实现调车场算法; 了解复数。 用法: 将仓库添加到您的pom.xml中: <id>bracer-mvn-repo <url>...
j表达式数学表达式解析器和计算器
MathEx使用JJTree( )定义解析器来定义数学表达式语言。 最好的介绍可能是查看 ,其中有几个测试也可以作为示例。 建造 要从源代码构建,请运行以下命令: git clone http://github.com/tesract/MathEx cd MathEx...
逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。...
漂亮公式一个小的Java库,用于将数学公式解析为LaTeX并将其显示为图像。 式: (a_1 / (b_1 + sqrt(c))^2) + sin(a_2 * b_2)图片: 胶乳: \left ( \frac {{a}_{1}}{{ \left ({b}_{1}+ \sqrt {c} \right )}^{2}} \...
同EL和BeanScript不同,IK Expression的设计目标是面向最终用户的,因此它被设计成语法简单(像数学算式),通俗易懂(支持中文变量及函数名)但功能有限的解析引擎。如果你需要一个功能强大的表达式引擎,也许IK ...
评估存储在字符串中的数学表达式的库。 库是用Swift v1.2编写的。 它将类似这样的内容:“ 1234769.1234 * 1238746-1234(-12)^ 2”更改为:1,529,565,134,839.26。 有人会说这是纯粹的魔术! 该库的Java分支...