浏览 2479 次
锁定老帖子 主题:Java版运算表达式解析器
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-08
最后修改:2009-09-08
对有括号的四则运算解析并求解. 支持多种表达式类型 思路: 1.把中缀表达式转化成后缀表达式 2.从后缀表达式得到解 注意: 该版本只支持1.6JDK,如果想替换成1.5JDK改替换LinkedList的几个方法就行了. 测试用例: //初始化 //初始化符号优先级 priorities = new HashMap<String,Integer>(); priorities.put("(", 9); priorities.put(")", 9); priorities.put("/", 8); priorities.put("*", 8); priorities.put("+", 7); priorities.put("-", 7); //初始化表达式字典 dict = new HashMap<String,Double>(); dict.put("a", 2.0); dict.put("b", 1.0); dict.put("c", 5.0); dict.put("d", 3.0); dict.put("e", 1.0); dict.put("f", 4.0); dict.put("g", 10.0); dict.put("h", 5.0); dict.put("i", 6.0); //初始化特殊表达式字典 realDict = new HashMap<String,Double>(); realDict.put("{a}", 1.0); realDict.put("{b}", 2.0); realDict.put("{c}", 3.0); realDict.put("{d}", 4.0); realDict.put("{e}", 5.0); realDict.put("{f}", 6.0); realDict.put("{g}", 7.0); realDict.put("{h}", 8.0); realDict.put("{i}", 9.0); //测试一般表达式 public void testGetValueByExpression(){ String expression = "a+b+c+d*(g-f)";// 2+1+5+3*(10-4) assertEquals( new Double(26.0), new ExpressionUtil().getValueByExpression( expression, dict, priorities ) ); } //测试特殊表达式 public void testGetValueByExpressionX(){ String expression = "({c}-{a}+{b})*({e}-{d})+{f}-{i}/{c}"; //(3-1+2)*(5-4)+6-9/3 =7 assertEquals( new Double(7.0), new ExpressionUtil().getValueByExpression( expression, realDict, priorities, new String[]{"{","}"}//如果是[a]或者$a$直接替换就行 ) ); } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |