1

我有一张有条件的桌子

尺寸 | 类型 | 编号 | 内容
1 | 2 | 1 | "海"
null | 空 | 空 | “默认内容”
1 | 空 | 空 | “尺寸 1 的内容”

我将表中的每一行都放入对象列表中。

class A{  
  private String size="";  
  private String type="";  
  private String id="";  
 private String content = "";  
}  

要求是显示与最大条件匹配的行对应的内容。否则显示默认消息(对应于 'null,null,null' 行)。

我怎么能在流口水中做到这一点?我完全迷路了。

4

1 回答 1

1

首先清理您作为内容输入获得的数据,它看起来与问题有点不一致。

接下来你需要做的是用对象表示你的问题的领域。举例来说,创建一个名为 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())!

于 2012-07-10T23:29:19.110 回答