首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Drools规则引擎对对象列表进行排序

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

Stack Overflow用户
提问于 2014-12-22 12:16:47
回答 2查看 3.5K关注 0票数 2

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

代码语言:javascript
复制
public class A {

   String name;
   Date createdDate;

}

我也想

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

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

我能用drools引擎实现这一点吗?

我曾想过使用compareTo()进行排序,但是由于排序条件可以在运行时更改,逻辑变得越来越复杂和难以维护。

谢谢,

Kolitha.

EN

回答 2

Stack Overflow用户

发布于 2014-12-22 16:34:16

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

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

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

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2016-06-30 21:06:57

这就是用口水分类的方法。

代码语言:javascript
复制
rule "Rule 03"
    when
        $number : Number( )
        not Number( intValue < $number.intValue )
    then
        System.out.println("Number found with value: " + $number.intValue() ); 
        retract( $number );
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27602564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档