我的主地图对象里面包含另一个地图。现在我需要从drools中获取它的价值吗? 我的代码看起来像
HashMap<String,Object> studentsMap = new HashMap<String,Object>();
HashMap<String,int> marksMap = new HashMap<String,int>();
marksMap.put("Maths",98);
marksMap.put("Chemistry",96);
studentsMap.put("JohnDoe", marksMap);
我将这个'studentsMap'对象插入到drools会话并触发规则。 如何比较drools中的标记值(如果标记大于90,如何检查条件)?
答案 0 :(得分:2)
建议的解决方案对我没有用。
您需要在eval中以不同方式调用map。
rule "studentsMap"
when
Student($marks : markMap)
eval((int)$marks.get("Maths") > 90)
then
System.out.println("mark greater than 90");
end
还应该进行额外的铸造。
链接:http://lists.jboss.org/pipermail/rules-users/2007-November/003921.html
UPD :找到更常规的方式来做到这一点
rule "studentsMap"
when
$student: Student($marks : markMap, $marks.get("Maths") > 90)
then
System.out.println("mark greater than 90");
end
您还可以在调用get之前检查地图中的密钥存在。
$student: Student($marks : markMap, $marks.containsKey("Maths"), $marks.get("Maths") > 90)
答案 1 :(得分:0)
我还没有尝试过,但可能会有这样的事情
rule "studentsMap"
when
entry : Entry() from $studentsMap.entrySet()
marksMap : Map() from entry.getValue()
markEntry : Entry() from marksMap.entrySet()
mark : Number() from markEntry.getValue()
mark > 90
then
System.out.println("mark greater than 90");
end
答案 2 :(得分:0)
我假设你的事实名称是学生。 该规则将如下所示:
rule "studentsMap"
when
Student($markMap : markMaap)
eval($markMap["Maths"] > 90)
then
System.out.println("mark greater than 90");
end