2012-08-12 69 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