如何在java和drools中比较和设置精确集合?

时间:2016-07-13 19:22:33

标签: java arraylist hashmap drools

我有一个java类,如下所示

public  class Ball 
{
  private int size;
  private String brand;
  private ArrayList<String> colour;
  private HashMap<String, String> price;

  //getter and setters

}

我想创建Drools规则(java方言)来读取尺寸,品牌和颜色并相应地设置价格图。

color ArrayList应匹配精确的例如如果球有红色,黑色&amp;蓝色颜色在一起,然后应该应用特定规则。

价格图,例如 [{&#34; US&#34;,&#34; 1.79&#34;},{&#34; UK&#34;,&#34; 1.48&#34;},{&#34 ;阿联酋&#34;,&#34; 11.37&#34;}] 。不要把它与json混淆,它是一个java HashMap。

rule "rule 1"
when
ball : Ball
(
 size == 14,
 brand ==  "NIVIA",
 colour ==  //here i want to compare exact match of the arraylist.
)
then
 ball.setPrice(//here i want to set price map);
end

请帮助创建.drl文件

1 个答案:

答案 0 :(得分:0)

首先,我们应该质疑使用List<String>来保存多种颜色。订单真的很重要吗?您可能希望区分红色球与绿色和蓝色点与白色球与紫色条纹,但即便如此&#34;顺序&#34;单凭赢得无法表达所有细微之处。 Point是,List.equals(以及Drools中的==)被定义为当且仅当元素相等时才返回true,逐个

如果您使用String[]并致电Arrays.equals(),则会出现同样的问题。

我认为最好的解决方案是使用

private Set<String> colour;

并将规则写为

rule "rule 1"
when
    ball: Ball( size == 14, brand ==  "NIVIA",
                colour == new HashSet( Arrays.asList("Red", "Black", "Blue") ) )
then
    ball.setPrice(...);
end

您的Java应用程序可能提供Ball方法:

public boolean hasColours( String... colours )

这将简化规则中的表示法:

  ball: Ball( size == 14, brand ==  "NIVIA",
              ball.hasColours("Red", "Black", "Blue") )