Правило проверки наличия объекта в списке

как я могу проверить с помощью языка правил Drools (DRL), если объект также является частью списка?

Давайте посмотрим на пример экзамена. Представьте ситуацию, когда у экзамена есть комната, а также список. Теперь я хочу проверить, находится ли объект Room в списке. Есть ли такая функция, как roomList.contains(rooms)?

Мне это нужно для ДХО.

Спасибо


person Vivid    schedule 12.08.2012    source источник


Ответы (3)


Для такой модели:

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

Вы также можете использовать оператор «memberOf», чтобы проверить, является ли элемент членом списка, или просто напрямую вызывать методы, если вы используете Drools 5.4+.

person Edson Tirelli    schedule 13.08.2012

Если вы случайно занимаетесь структурой списка коллекций в java... тогда да, у нас есть метод под названием frequency().

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

Collections.frequency(l, "room1");
person Kumar Vivek Mitra    schedule 12.08.2012
comment
Не знаю, отвечает ли это на вопрос, но приятно знать! - person MadProgrammer; 13.08.2012
comment
Но это не способ проверить DRL (Drools Rule Language). - person Vivid; 13.08.2012

у меня следующая ситуация

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));

конец

Моя проблема в том, что я хочу проверить, находится ли комната левого экзамена в roomList комнаты правого экзамена.

Извините за этот вопрос, но я не нашел ссылки на язык.

person Vivid    schedule 13.08.2012
comment
Вы должны были добавить эту информацию к своему исходному вопросу, а не добавлять ее в качестве ответа на вопрос. Я отредактировал свой предыдущий ответ, чтобы дать вам пример, подобный этому. - person Edson Tirelli; 14.08.2012
comment
Я изменил DRL-файл, о котором идет речь выше! Я получаю эту ошибку: java.lang.RuntimeException: невозможно вызвать геттер: getRoom [declr.class: domain.Exam; act.class: domain.Exam] (см. трассировку) Причина: java.lang.RuntimeException: невозможно вызвать метод: domain.Room.getRoomslist: цель метода равна null - person Vivid; 14.08.2012
comment
Проблема, кажется, в room.roomsList. Иногда список комнат пуст. Но он никогда не должен быть нулевым. Возможно, слюни не могут получить доступ к списку номеров. - person Vivid; 14.08.2012
comment
Убедитесь, что у вас есть правильные методы getXXX() в классах. - person Edson Tirelli; 14.08.2012
comment
У меня есть getRoom(), а внутри Room у меня есть getRoomsList(). Но это не работает для меня. - person Vivid; 15.08.2012
comment
Кажется, в TopicConflict есть экзамены, для которых нет места. Это должно быть причиной того, что Drools не может найти getRoomsList. Может быть, было бы проще написать функцию в комнате или на экзамене, которую я мог бы вызывать из DRL. Есть ли решение? - person Vivid; 15.08.2012