评估布尔字符串表达式?

可能重复:
评估以字符串forms给出的数学表达式

我如何布尔值计算包含bool表达式的字符串? 喜欢:

String userVar[] = {"a = 1", "b = 1", "c = 0"}; String expr = "a & b & c"; boolean result = evaluate(expr); //would evaluate to false 

用户应该能够定义自己的变量( a = 1 ),并定义自己的布尔表达式( a & b & c )。 所以我将所有表达式仅作为字符串。 我该如何评估它们?

您可以使用Nambari评论的ScriptEngine:

 ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); String userVar[] = {"a = 1", "b = 1", "c = 0"}; for (String s : userVar) { engine.eval(s); } String expr = "a & b & c"; System.out.println(engine.eval(expr)); 

打印0。

另请注意,表达式不是布尔表达式,而是按位运算。

最后,我为上述问题的解决方案制作了代码。

 public static void main(String[] args) { String userVar[] = { "a = 1", "b = 0", "c = 1" }; String expr = "a & b & c"; // System.out.println(Boolean.valueOf("true")); Map booleanMap = getBooleanMap(userVar); // System.out.println(booleanMap); boolean evaluate = evaluate(booleanMap, expr); System.out.println("Final Result = " + evaluate); } public static boolean evaluate(Map operVal, String eq) { String[] split = eq.split(" "); boolean orgVal = false; boolean prevVal = false; boolean firstTime = true; String lastOpr = "&"; for (String exp : split) { // System.out.println(orgVal + " " + exp); // System.out.println(exp); if (exp.equals("&")) { lastOpr = "&"; orgVal = orgVal && prevVal; } else if (exp.equals("|")) { lastOpr = "|"; orgVal = orgVal || prevVal; } else { prevVal = operVal.get(exp); if (firstTime) { orgVal = prevVal; firstTime = false; } } } if (lastOpr.equals("&")) { lastOpr = "&"; orgVal = orgVal && prevVal; } else if (lastOpr.equals("|")) { lastOpr = "|"; orgVal = orgVal || prevVal; } // System.out.println(orgVal); return orgVal; } public static Map getBooleanMap(String[] val) { Map result = new HashMap(); for (String exp : val) { String[] split = exp.split("="); // System.out.println(split[0].trim()); // System.out.println(split[1].trim()); String opr = split[0].trim(); int intVal = Integer.valueOf(split[1].trim()); boolean boolVal = false; if (intVal == 1) { boolVal = true; } result.put(opr, boolVal); } return result; } 

测试案例 – 1

 String userVar[] = {"a = 1", "b = 1", "c = 0"}; 
  • 输出最终结果= false

测试案例 – 2

 String userVar[] = { "a = 1", "b = 1", "c = 1" }; 
  • 输出最终结果= true