Как сравнить объект ArrayList (класс Java) в JESS?
Это мой основной метод.
public static void main(String[] args) throws JessException {
Rete engine = new Rete();
engine.batch("template.clp");
PizzaBase pizzaBase = new PizzaBase();
pizzaBase.setSize(9);
PizzaTopping pizzaTopping = new PizzaTopping();
pizzaTopping.setName("T1");
PizzaTopping pizzaTopping2 = new PizzaTopping();
pizzaTopping2.setName("T2");
PizzaTopping pizzaTopping3 = new PizzaTopping();
pizzaTopping3.setName("T3");
List<PizzaTopping> pizzaToppingList = new ArrayList<PizzaTopping>();
pizzaToppingList.add(pizzaTopping);
pizzaToppingList.add(pizzaTopping2);
pizzaToppingList.add(pizzaTopping3);
Pizza pizza = new Pizza();
pizza.setBase(pizzaBase);
pizza.setPizzaToppingList(pizzaToppingList);
engine.add(pizzaBase);
engine.addAll(pizzaToppingList);
engine.add(pizza);
engine.eval("(facts)");
engine.batch("rules.clp");
engine.reset();
engine.run();
engine.eval("(facts)");
}
Я хотел бы проверить пиццу, которая содержит название топпинга "T2" в списке pizzaToppingList или нет. Правило показано ниже
(defrule rule1
(Pizza (pizzaToppingList ?t2) (OBJECT ?a))
(PizzaTopping (name "T2") (OBJECT ?t2))
=>
(printout t "fired")
)
Но это не работает, потому что в JESS значением слота pizzaToppingList является ArrayList(объект java). Это означает, что слот pizzaToppingList не является значением Lists в JESS.
Как я решаю эту проблему? поблагодарить!
1 ответ
Решение
Ну, вам придется вызывать метод собственного класса Java ArrayList. Простой способ заключается в использовании test
CE:
(defrule rule1
(Pizza (pizzaToppingList ?ptList) (OBJECT ?a))
(PizzaTopping (name "T2") (OBJECT ?t2))
(test (?ptList contains ?t2) )
=>
(printout t "fired")
)
То, что вы пробовали, не может работать, так как вы используете одну и ту же переменную привязки ?t2
для списка и для того, что может быть одним из его элементов.