0

重複の可能性:
文字列形式で与えられた数式の評価

ブール式を含む文字列をブール値で評価するにはどうすればよいですか? お気に入り:

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。したがって、すべての式を文字列としてのみ使用します。それらをどのように評価できますか?

4

2 に答える 2

4

ナンバリがコメントしたように、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 を出力します。

また、式はブール式ではなく、ビット演算であることに注意してください。

于 2012-12-08T18:04:38.560 に答える
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"};
  • 出力最終結果 = false

テスト ケース - 2

String userVar[] = { "a = 1", "b = 1", "c = 1" };
  • 出力最終結果 = true
于 2012-12-08T18:00:25.197 に答える