论坛首页 Java企业应用论坛

Java版运算表达式解析器

浏览 2461 次
精华帖 (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$直接替换就行
			)
		);
	}

  • src.zip (1.8 KB)
  • 下载次数: 175
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics