2012-12-08 148 views
0

可能重复:
Evaluating a math expression given in string form评估布尔字符串表达式?

我怎样才能布尔评估包含布尔表达式的字符串?像:

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)。所以我将所有的表达式只作为一个字符串。我如何评估他们?

+3

这可能有助于http://stackoverflow.com/questions/3422673/evaluating-a-math-expression-given-in-string-form – kosa

回答

2

可以使用的ScriptEngine的评论说Nambari:

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

还要注意的是表达不一个布尔表达式,但是一个按位操作。

1

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

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<String, Boolean> booleanMap = getBooleanMap(userVar); 
     // System.out.println(booleanMap); 
     boolean evaluate = evaluate(booleanMap, expr); 
     System.out.println("Final Result = " + evaluate); 

    } 

    public static boolean evaluate(Map<String, Boolean> 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<String, Boolean> getBooleanMap(String[] val) { 
     Map<String, Boolean> result = new HashMap<String, Boolean>(); 

     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"}; 
  • 输出最终结果=假

测试案例 - 2

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