2012-12-08 93 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" }; 
  • 輸出最終結果=真