drools - 使用 Drools 规则引擎对对象列表进行排序

标签 drools

我正在尝试使用 drools 规则引擎中定义的一组规则对对象列表进行排序。 示例对象结构如下

public class A {

   String name;
   Date createdDate;

}

我想要

  1. 定义一组用于对对象列表进行排序的规则。
    例如:规则 1:“使用名称升序对对象进行排序”
    规则2:“使用createdDate降序对对象进行排序”

  2. 定义规则需要执行的顺序。
    例如:将顺序 1 设置为规则 1
    将顺序 2 设置为规则 2
    因此,对象将按名称升序和创建日期降序排序。

我可以使用 drools 引擎实现此目的吗?
我想过使用compareTo()进行排序,但由于排序标准可以改变 在运行时逻辑变得复杂且难以维护。

谢谢,
Kolitha

最佳答案

Drools 不会像快速排序或某些类似的排序算法重新排列数组或其他聚合中的对象那样对对象进行排序。您可以做的是让规则重复触发,对于一组事实(例如 A 类对象)中的每个事实一次,并带有保证按特定顺序发生的约束。此外,您还需要跟踪 已经处理过的事实。

因此,首先要回答的问题是:为什么需要按一定顺序排列对象?

如果事实需要按此顺序处理,则不必按照通常的含义对它们进行排序,上述规则就足够了:

declare ListOfA
    listOfA: List
end

rule noListOfA
when
    not ListOfA()
then
    ListOfA loa = new ListOfA();
    loa.setListOfA( new ArrayList() );
    insert( loa );
end

rule sortA
when
    $a: A( $name: name, $createdDate: createdDate )
    $loa: ListOfA( $listOfA: listOfA not contains $a )
    not A( this != $a, this not memberOf $listOfA,
                       name < $name ||
                       name == $name && createdDate > $createdDate )
then
    System.out.println( $a );
    modify( $loa ){ getListOfA().add( $a ) }
end

关于drools - 使用 Drools 规则引擎对对象列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27602564/

相关文章:

gwt - 流口水 Maven 依赖与 GWT 冲突

eclipse - 无法打开 drl 文件,因为它不存在

java - drools (6.2) 事实不会在有状态 session 中重新评估

Drools 存在与 "normal"模式

java - 在 Java 代码中访问 drool 规则详细信息

java - Drools 适用于我的场景吗?如果不是还有什么?

java - Drools 中的正则表达式

java - Drools 无法在 DRL 中对函数参数使用泛型类型

java - 以编程方式将项目 JAR 部署到 Artifact

java - Drools API 混淆