比较Drool 5.5中的字符串值字段

时间:2013-05-28 01:01:59

标签: drools

当使用Drools 5.5 final来比较字符串值字段时,我遇到了一些令人费解的问题。

基本上,我试图找出是否有一对人共用同一个名字。 Person类如下所示:

public class Person {
  private String name;

  public String getName()      { return name; }
  public void setName(String n) { this.name = n; }
  public Person(String name)    { this.name = name;}
}

我尝试触发的规则是:

rule "uniquePersonName"
when
    $p1: Person($n1: name)
    $p2: Person(this != $p1, name == $n1)
then
    System.out.println("Duplicated person name found : " + $n1 + " " + $p2.getName());
end

但它永远不会被触发。但是,如果我将其更改为:

when
    $p1: Person($n1: name)
    $p2: Person(this != $p1, name != $n1)

系统按预期工作,换句话说,它找到人员名称不同的所有对。

深入挖掘之后,我发现如果我将名称字段更改为Integer类型,原始规则工作正常。这让我觉得这是因为String比较的一些错误。因此,将name字段定义为String类型,我尝试了:

  1. not(name == $ n1)
  2. (name == $ n1)
  3. name.toString()= $ n1.toString()
  4. name == $ p1.getName()
  5. 不幸的是,他们都没有工作。

    最后,我能让它行为的唯一方法就是将规则写成:

    when
        $p1: Person($n1: name)
        $p2: Person(name == $n1)
        eval($p1!=$p2)
    

    这让我觉得这个问题可能是由于“this”如何工作以及如何进行String比较而引起的。

    这是非常基本的功能,我很惊讶这是由于Drools 5.5决赛中的一个错误造成的。但同样,我看不到任何方法。你们有人可以帮忙吗?

    感谢。

    GW

1 个答案:

答案 0 :(得分:4)

事实证明“this!= $ p1”转换为!this.equals($ p1),在我的代码中我有一个自动生成的#equals方法(代码未在原帖中显示),这完全改变了默认的比较行为。删除#equals方法后,所有方法都按预期工作。