首先清理您作为内容输入获得的数据,它看起来与问题有点不一致。
接下来你需要做的是用对象表示你的问题的领域。举例来说,创建一个名为 ContentObject 的 pojo,其属性映射到输入文件中定义的属性(注意,您需要一个整数或实现 Comparable 的东西来允许您进行排序)。接下来你需要的是一个 pojo 来保存你的最大值(包含一个名为 max 的属性)。
创建无状态知识会话并用对象填充它。再次,为了举例,说:
// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
// build the session input objects
ContentObject co1 = new ContentObject(0,"T1","id1", "Some Content 1");
ContentObject co2 = new ContentObject(1,"T2","id2", "Some Content 2");
ContentObject co3 = new ContentObject(3,"T3","id3", "Some Content 3");
Max max = new Max();
// populate a fact set
Set<Object> facts = new HashSet<Object>();
facts.add(co1); facts.add(co2); facts.add(co3); facts.add(max);
// run rules
ksession.execute(facts);
// display result
System.out.println(max.getMax());
在单独的资源中定义以下流口水:
package com.yourpackage
import com.yourpackage.ContentObject;
dialect "mvel"
rule "GetMax"
when
m1 : ContentObject ()
mx : Max( m1.size > max )
then
mx.max = m1.size;
update(mx);
end
我认为在 Drools 中不那么明显的是对象在工作内存中是如何组织和使用的。值得在 drools 文档中搜索术语“交叉产品”。
另外,在你用 drools 实现这个简单的算法之前,请记住,java 中有一个可以做同样事情的单行代码(假设你正在实现 Comparable - cf Collections.sort())!