当前位置: 首页 > 知识库问答 >
问题:

是否有用于存储布尔表达式的数据结构?

党俊健
2023-03-14

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

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

每个x变量都是一个布尔表达式,如=!=的值。问题是存储嵌套的ANDOR子句(在它们内部和/或彼此内部),并用not包装它们。包裹深度可以很深。

Java SDK是否具有这些表达式的数据结构?

共有3个答案

翟迪
2023-03-14
abstract class Predicate {...}
class AndPredicate extends Predicate {
  private Predicate[] conjuncts;
  ...
}
class OrPredicate extends Predicate {
  private Predicate[] disjuncts;
  ...
}
class NotPredicate extends Predicate {
  Predicate negated;
  ...
}

有什么问题?

施洛城
2023-03-14

你可以试着用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));

这个问题的例子

PS:它不包括在标准的sdk,但很容易使用。

束研
2023-03-14

在Java8功能接口谓词

这是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());
}

记住-只Java8岁以上!

 类似资料:
  • 3.7 Python 布尔表达式用作控制结构* 有了顺序、分支和循环控制结构,原则上已足以表达所有算法。然而,为了在解决某些问题时编程更加方便,各种语言还提供了若干其他控制结构。本节介绍 Python 的一个特色, 即布尔表达式可当作控制结构来用。 编程语言中的表达式本来只是用来产生值的,布尔表达式也不例外。布尔表达式的常规 用法是计算产生 True 或 False,并用在分支和循环控制结构当中。

  • 问题内容: 由于MySQL似乎没有任何“布尔”数据类型,因此您“滥用”哪种数据类型在MySQL中存储正确/错误信息? 尤其是在从PHP脚本进行读写的情况下。 随着时间的流逝,我已经使用并看到了几种方法: tinyint,包含值0/1的varchar字段, 包含字符串‘0’/‘1’或’true’/’false’的varchar字段 最后枚举包含两个选项“ true” /“ false”的字段。 以上

  • 我开始学习布尔表达式。我正试图找出以下问题: 假设age1、age2和age3是int变量,假设答案是布尔变量。编写一个表达式,当age1小于或等于age2并且age2小于或等于age3时,该表达式将答案指定为true。否则答案应为false。 我已经尝试了一些东西,但对Java来说还是比较陌生的。我能把答案打印出来,但我的数字还是有问题。 这是错误的: 我只是不知道如何解决这个问题,或者代码中到

  • 我有两个实体:类别和具有一对多关系的产品。 如果价格大于100,我如何按产品数量订购类别?类似(这不起作用):

  • 问题内容: 所以我有一个关于考试作业的问题,在这个作业中,我们有一堆布尔表达式,例如: 然后,我们应该编写布尔表达式的值。为此,我使用了三值逻辑,但是当您获得如下所示的布尔表达式时,这将如何应用: 或者 通过三值逻辑可以很容易地找到第一个,但是我如何找出另外两个。 我知道这是一个非常基本的问题,但是我对此仍然是陌生的。 提前致谢 问题答案: 您需要布尔值和的三相真值表: 该表是缩写,依赖于布尔逻辑

  • 我正在寻找一个易于计算的字符串,作为包含双精度和布尔值的布尔表达式。 我已经看过javaluator了,但我不确定它是否在一个表达式中支持多种数据类型,比如double和boolean?! 最大的挑战是,变量值不是存储在变量“exposeOk”中,而是存储在包含字符串-值对的对象列表中。因此,如果计算器需要exposeOk的值,它必须在列表中搜索包含字符串“exposeOk”的对象,并且必须使用存