我有一个有条件的表
尺寸|类型| id |内容
1 | 2 | 1 | “海”
null | null | null | “默认内容”
1 | null | null | “内容为1号”
我将表格中的每一行都放入一个对象列表中。
class A{
private String size="";
private String type="";
private String id="";
private String content = "";
}
要求是显示与最大条件匹配的行对应的内容。 else显示默认消息(对应于'null,null,null'行)。
我怎样才能在流口水中这样做?我完全迷失了。
答案 0 :(得分:1)
首先清理您收到的数据作为内容的输入,但问题看起来有些不一致。
您需要做的下一件事是用对象表示问题的域。为了示例,创建一个名为ContentObject的pojo,其属性映射到输入文件中定义的属性(注意,您需要一个整数或实现Comparable的东西以允许您进行排序)。接下来你需要的是保持最大值(包含一个名为max的属性)的pojo。
创建无状态知识会话并使用对象填充它。同样,出于举例的目的,请说:
// 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文档中搜索术语“交叉产品”。
Aslo,在你在drools中实现这个简单的算法之前要记住,在java中有一个单行程会做同样的事情(假设你正在实现Comparable - cf Collections.sort())!