求一个动态布尔公式算法~~~~~~~~~~~~~~~~~~~~~~~~~ 情况是这样的,比如 我将a>b||b>c&&a<d(公式的变量会先被附上值)带入到那样的公式里面去,会给我返回正确的布尔值,公式的组合是多样的,有加减乘除,括号以及||、&&等(将字符串转换为公式计算出布尔值),大虾们都看过来吧,拜谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用antlr吧把你的语法,用lr语言写出来,antlr会自动帮你生成词法语法解析的类然后调用之,生成语法树,计算结果 ExpressionOasis 简直就是为你贴身定制 看看这个http://code.google.com/p/expressionoasis/ TO2楼:不会;TO3楼:说得很清楚了吧,就是a=3,b=4,然后有a>b,替换后就是3>4,把3>4转到公式里面去算出布尔值出来;TO4楼:下了,不过没有整合好,感觉少好多东西,没有测试成功 jdk1.6+, javax.script.* public static void main(String[] args) throws Exception { String expression = "a>b||b>c&&a<d"; Map<String, Object> param = new HashMap<String, Object>(); param.put("a", 1); param.put("b", 123); param.put("c", 100); param.put("d", 9999); System.out.println(eval(expression, param)); } public static boolean eval(String expression, Map<String, Object> param) throws Exception { ScriptEngine engine = new ScriptEngineManager() .getEngineByName("javascript"); ScriptContext ctx = new SimpleScriptContext(); for (Entry<String, Object> entry : param.entrySet()) { ctx.setAttribute(entry.getKey(), entry.getValue(), ScriptContext.ENGINE_SCOPE); } return (Boolean)engine.eval(expression, ctx); } 顶个 Java6支持运行脚本语言 不过LZ你最好预先准备好 如果光是公式还好 以后要是让你调用JAVA函数可别2了 http://www.cnblogs.com/jssy/archive/2006/10/23/537101.html 另我十分困惑的问题 frameset src 问题 struts2值返回到jsp页面的问题 怎么在acion和jsp中传递参数 struts+spring+hibernate的新问题? 怎么用nested:iterate显示Action里面查询到的数据? 怎样检验一个Java应用程序已经启动 请问哪里有J2EE SDK1.3下载? 各位老大:在EJB开发中,直接使用存储过程好还是使用CMP调用数据库好? 有关用java处理XML文档的问题,请高手帮忙。 网站打不开怎么办? 关于SQL语句的LIKE查询
把你的语法,用lr语言写出来,antlr会自动帮你生成词法语法解析的类
然后调用之,生成语法树,计算结果
TO3楼:说得很清楚了吧,就是a=3,b=4,然后有a>b,替换后就是3>4,把3>4转到公式里面去算出布尔值出来;
TO4楼:下了,不过没有整合好,感觉少好多东西,没有测试成功
public static void main(String[] args) throws Exception {
String expression = "a>b||b>c&&a<d";
Map<String, Object> param = new HashMap<String, Object>();
param.put("a", 1);
param.put("b", 123);
param.put("c", 100);
param.put("d", 9999);
System.out.println(eval(expression, param));
} public static boolean eval(String expression, Map<String, Object> param) throws Exception {
ScriptEngine engine = new ScriptEngineManager()
.getEngineByName("javascript");
ScriptContext ctx = new SimpleScriptContext();
for (Entry<String, Object> entry : param.entrySet()) {
ctx.setAttribute(entry.getKey(), entry.getValue(), ScriptContext.ENGINE_SCOPE);
}
return (Boolean)engine.eval(expression, ctx);
}