有没有一种数据结构可以存储布尔表达式?

6

我需要存储像这样的布尔表达式:

x1 AND x2 AND x3 OR (x4 AND x5) AND (NOT x6)

每个x变量都是一个布尔表达式,例如==!=,具有值。问题是存储嵌套的ANDOR子句(在它们内部和/或相互内部)并用NOT包装它们。包装深度可以非常深。
Java SDK是否有用于这些表达式的数据结构?

没有这样的标准数据结构。 - Andy Turner
布尔表达式毕竟是数学表达式,为了正确处理它们,我认为您需要一个符号操作库,因为Java(以及大多数编程语言)只能处理开箱即用的数字操作。谷歌建议:https://github.com/yuemingl/SymJava - chiliNUT
你是怎么做到的? - Anmol Gupta
3个回答

2
在Java 8中,函数式接口 Predicate<T> 是正确的选择。
这里是Java文档
还有各种例子
因此,在您的用例中,应该是以下内容:
public static Predicate<Integer> equals(Integer compare) {
    return i -> i.equals(compare);
}

public static Predicate<Integer> complex() {
    return equals(1).and(equals(2)).and(equals(3)).or(equals(4).and(equals(5))).and(equals(6).negate());
}

记住——只有Java 8及以上版本!

0
你可以尝试使用 jexl(http://commons.apache.org/jexl/)来解决问题。
JexlEngine jexl = new JexlEngine();
    jexl.setSilent(true);
    jexl.setLenient(true);

    Expression expression = jexl.createExpression("(a || b && (c && d))");
    JexlContext jexlContext = new MapContext();

    //b and c and d should pass
    jexlContext.set("b",true);
    jexlContext.set("c",true);
    jexlContext.set("d",true);

    assertTrue((Boolean)expression.evaluate(jexlContext));

    jexlContext = new MapContext();

    //b and c and NOT d should be false
    jexlContext.set("b",true);
    jexlContext.set("c",true);

    //note this works without setting d to false on the context
    //because null evaluates to false

    assertFalse((Boolean)expression.evaluate(jexlContext));

来自这个问题的示例

附注:它不包含在标准 SDK 中,但非常容易使用。


0
abstract class Predicate {...}
class AndPredicate extends Predicate {
  private Predicate[] conjuncts;
  ...
}
class OrPredicate extends Predicate {
  private Predicate[] disjuncts;
  ...
}
class NotPredicate extends Predicate {
  Predicate negated;
  ...
}

问题是什么?


问题在于 - 不要重复造轮子并支持它。有很多数据结构,如Maps、Lists、Sets,但没有一个用于布尔表达式? - Cherry
这样的数据结构通常可以在编译器技术中找到。你可以搜索一个将其内部数据结构公开为公共库的编译器。祝你好运。 - Erwin Smout

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接