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

时间:2014-12-22 12:16:47

标签: drools

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

公共等级A {

字符串名称;
   Date createdDate;

}

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

  1. 定义规则需要执行的顺序 例如:将订单1设置为规则1
         将订单2设置为规则2
    因此,对象将按名称升序和createdDate降序排序。
  2. 我可以使用drools引擎实现这一目标吗?
    我想使用compareTo()进行排序,但由于排序标准可以更改 在运行时,逻辑变得复杂且难以维护。

    谢谢,
    Kolitha

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

这是以流氓排序的方式。

rule "Rule 03"
    when
        $number : Number( )
        not Number( intValue < $number.intValue )
    then
        System.out.println("Number found with value: " + $number.intValue() ); 
        retract( $number );
end