发布
社区首页 >问答首页 >在集合中可以找到除P之外的Drools约束对象

在集合中可以找到除P之外的Drools约束对象
EN

Stack Overflow用户
提问于 2013-11-21 21:18:53
回答 2查看 391关注 0票数 1

很长一段时间以来,我一直在努力弄清楚这件事。我可以想象有很多非常冗长和非流口水的方式来实现这一点。不过,我想知道处理这种情况的最佳做法。我想知道如何用drools方言写出下面描述的约束。

我希望编写一个处理集合的约束。假设我们有CustomType,它有一个字段集合。约束应该表示我们希望找到在集合中除指定对象(P)之外有任何对象的CustomType的事实。关键的是,指定的对象是否存在并不重要。只有在集合中至少有一个其他对象时,才有关系。

所讨论的集合不是一个集合。可能在同一个集合中有多个P实例。

在伪Java中,我可能编写如下方法:

代码语言:javascript
代码运行次数:0
复制
public Boolean isThereANotP(CustomType cs){
for(str : cs.Collection){
    if(str != P){
        return true}
}
return false
}

如何在流口水的when子句中表达这一点?我能做的最接近的就是指定有而不是a P,但这不是我想要的。我想知道a而不是P。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-22 09:04:21

也许这个?

代码语言:javascript
代码运行次数:0
复制
$c: CustomType()
$notP: Object(this != objectP) from $c.collection

实际上,这将激活集合中的每个对象,而不是objectP。这样做可能更好:

代码语言:javascript
代码运行次数:0
复制
$c: CustomType()
exists Object(this != objectP) from $c.collection
票数 1
EN

Stack Overflow用户

发布于 2013-11-22 08:49:34

小心,如果集合的第一个元素不是P,则发布的伪代码将返回true;或者,如果在P之前没有任何P,或者根本没有P,则返回true。假设你想要的是:

查找集合中有除指定对象以外的任何对象的CustomType的事实(P)

您可以编写一条类似于此的规则:

代码语言:javascript
代码运行次数:0
复制
global P objectP; //I'm using a global, but you could use a fact, or a binding in one of your fact's fields. 

rule "Find CustomType with no P"
when
    $c: CustomType(collection not contains objectP)
then
    //use $c
end

不过,我不知道如何解释您的其余需求:

关键的是,指定的对象是否存在并不重要。只有在集合中至少有一个--另一个对象--时才有关系。

如果您的要求是集合不应该是空的,那么您可以将您的模式编写为:

代码语言:javascript
代码运行次数:0
复制
CustomType(collection.empty == false , collection not contains objectP)

希望能帮上忙

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20132074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档