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

使用Drools规则引擎对对象列表进行排序,drools,Drools,我正在尝试使用drools规则引擎中定义的一组规则对对象列表进行排序。 示例对象结构如下所示 公共A类{ 字符串名; 创建日期; } 我想 定义一组用于对对象列表进行排序的规则。 例如:规则1:“使用名称升序对对象进行排序” 规则2:“使用createdDate降序对对象进行排序” 定义规则需要执行的顺序。 例:将订单1设置为规则1 将订单2设置为规则2 因此,对象将按名称升序和createdDate降序排序 我可以使用drools引擎实现这一点吗 我曾想过使用compareTo()进行排

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

公共A类{
字符串名;
创建日期;
}
我想

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

  • 定义规则需要执行的顺序。
    例:将订单1设置为规则1
    将订单2设置为规则2
    因此,对象将按名称升序和createdDate降序排序

  • 我可以使用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
    
    声明ListOfA
    列表:列表
    结束
    规则noListOfA
    什么时候
    不是()
    然后
    ListOfA loa=新ListOfA();
    loa.setListOfA(新的ArrayList());
    插入(loa);
    结束
    规则分类
    什么时候
    $a:a($name:name,$createdDate:createdDate)
    $loa:ListOfA($ListOfA:ListOfA不包含$a)
    不是A(这!=$A,这不是$listOfA的成员,
    姓名<$name||
    name==$name&&createdDate>$createdDate)
    然后
    系统输出打印项次($a);
    修改($loa){getListOfA().add($a)}
    结束
    
    这是对口水进行排序的方法

    rule "Rule 03"
        when
            $number : Number( )
            not Number( intValue < $number.intValue )
        then
            System.out.println("Number found with value: " + $number.intValue() ); 
            retract( $number );
    end
    
    规则“规则03”
    什么时候
    $number:number()
    非数字(intValue<$Number.intValue)
    然后
    System.out.println(“找到值为“+$Number.intValue()”的数字);
    收回(数目);
    结束