drools - 找到符合最大条件的对象

时间:2012-07-10 07:36:33

标签: drools

我有一个有条件的表

尺寸|类型| 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'行)。

我怎样才能在流口水中这样做?我完全迷失了。

1 个答案:

答案 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())!