2012-08-12 68 views
0

如果对象也是列表的一部分,如何通过Drools规则语言(DRL)进行检查?检查对象是否在列表中的规则

让我们来看看考试范例。形象化考试有一个房间和一个列表的情况。现在我想检查一下,如果Room对象在列表中。是否有像roomList.contains(房间)这样的功能?

我需要这个DRL。

感谢

回答

1

如果你是通过采取对集合框架的Java中的列表任何的机会......那么是的,我们确实有一种称为frequency()

List<String> l = new ArrayList<String>(); 

Collections.frequency(l, "room1"); 
+0

不知道这是否回答了这个问题,但很高兴知道! – MadProgrammer 2012-08-12 21:08:57

+0

但是,这是无法检查DRL(Drools规则语言)。 – Vivid 2012-08-12 21:16:46

2

对于这样一个模型:

class Exam { 
    Room room; 
... 
} 
class Room { 
    List<Room> roomsList; 
... 
} 

那么您的规则可能看起来像:

rule X 
when 
    $exam1 : Exam() 
    $exam2 : Exam(room.roomsList contains $exam1.room) 
then 
    // do something 
end 

您还可以使用“成员”操作员检查元素是否为成员一个列表,或者直接调用方法,如果你正在使用Drools 5.4+。

0

我有以下的情况

class Exam { 
    Room room; 
    ... 
} 
class Room { 
    List<Room> roomList 
    ... 
} 

我DRL-文件看起来是这样的:

rule "containsRoomOfRoom" 
when 
    $topicConflict : TopicConflict($leftTopic : leftTopic, $rightTopic : rightTopic) 
    $leftExam : Exam(topic == $leftTopic, $period : period, $leftRoom : room) 
    $rightExam : Exam(topic == $rightTopic, period == $period, room.roomsList contains $leftRoom) 
then 
    insertLogical(new IntConstraintOccurrence("roomPenalty", ConstraintType.NEGATIVE_HARD, 
      40, 
      $leftExam, $rightExam)); 

我的问题是,我要检查,如果leftExam的房间在rightExam的房间的房间列表中。

对不起,这个问题,但我没有找到任何语言参考。

+1

您应该将此信息添加到您的原始问题中,而不是将其添加为问题的答案。我编辑了我以前的答案,给你一个类似的例子。 – 2012-08-14 00:40:54

+0

我改变了上述问题的DRL文件!我得到这个错误: java.lang.RuntimeException:无法调用getter:getRoom [declr.class:domain.Exam; act.class:domain.Exam](见跟踪) 引起:java.lang.RuntimeException:无法调用方法:domain.Room.getRoomslist:方法的目标为空 – Vivid 2012-08-14 16:47:14

+0

问题似乎是room.roomsList。有时roomList是空的。但它永远不应该是空的。也许drools不能访问房间列表。 – Vivid 2012-08-14 16:56:11