代码之家  ›  专栏  ›  技术社区  ›  Adnan

在Java中评估布尔值

  •  6
  • Adnan  · 技术社区  · 14 年前

    我试图从一个字符串中评估以下内容

    boolean value = evaluate("false || true && true && false || true");
    

    我需要一个布尔值 true 就这一个。
    关于如何以最有效的方式解决这个问题有什么想法吗?

    4 回复  |  直到 14 年前
        1
  •  7
  •   aioobe    14 年前
    String value = ("false || true && true && false || true");
    boolean result = false;
    for (String conj : value.split("\\|\\|")) {
        boolean b = true;
        for (String litteral : conj.split("&&"))
            b &= Boolean.parseBoolean(litteral.trim());
        result |= b;
    }
    System.out.println(result); // prints true
    
        2
  •  1
  •   JRL    14 年前

    如果唯一的运算符是 && || ,那么我认为这是可行的:

      static boolean eval(String str) {
        String s = str.replaceAll("\\s|\\|\\|false|false\\|\\|", "");
        return !s.contains("false") || s.contains("||true");
      }
    

    对于更复杂的表达式,我发现 this library 就为了这个。 但不知道它有多高效。

        3
  •  0
  •   cadrian    14 年前

    你需要一个小的布尔表达式语法。一点递归解析就可以了。

    如果您不知道如何编写这样的解析器,可以使用javacc或类似的工具。

        4
  •  0
  •   fasseg    14 年前

    有可用的语法分析器,您可以为其定义语法。

    但是,如果您只得到和&as运算符,以及true和false作为值,那么您可以通过实现一个非常简单的有限状态机来轻松地做到这一点:

    1.)将字符串拆分为令牌

    2.)使用boolean.parse boolean(token)分析最左边的值,并在某个实例变量(您的状态)中保护它的值。

    3.)使用给定的运算符将实例变量与下一个布尔标记组合。

    4.)重复步骤3,直到完成整个字符串。

    虽然我没有彻底测试过,但这似乎有效:)

    public class BooleanFSParser {
    
        private boolean parse(String data) {
            String[] tokens=data.split("\\s");
            boolean state=Boolean.parseBoolean(tokens[0]);
            for (int i=1;i<(tokens.length / 2) + 1;i=i+2){
                if (tokens[i].equals("&&")){
                    state=state && Boolean.parseBoolean(tokens[i+1]);
                }else{
                    state=state || Boolean.parseBoolean(tokens[i+1]);
                }
            }
            return state;
        }
    
        public static void main(String[] args) {
            BooleanFSParser parser = new BooleanFSParser();
            boolean val = parser.parse("true && true || false");
            System.out.println(String.valueOf(val));
        }
    }
    

    这应该会给您一个正确解析的值,但是如果您允许使用方括号,它会变得更复杂一点;)

    玩得开心,看看这里的理论 Finite-state_machine