我正在尝试使用drools规则引擎中定义的一组规则对对象列表进行排序。
样本对象结构如下
公共等级A {
字符串名称;
Date createdDate;
}
我想要
1.定义一组用于对对象列表进行排序的规则
例如:规则1:“使用名称升序对对象排序”
规则2:“使用createdDate降序排序对象”
我可以使用drools引擎实现这一目标吗?
我想使用compareTo()进行排序,但由于排序标准可以更改
在运行时,逻辑变得复杂且难以维护。
谢谢,
的 Kolitha
答案 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