迭代时,在HashMap内部调用访问对象

时间:2015-11-11 06:41:24

标签: java oop hashmap drools

我已将用户定义的类中的对象添加到HashMap中。当插入Drools代码时,我可以遍历HashMap并获取键和值对。但我无法访问用户类中的属性,这是HashMap的值部分。

这是用于保存数据的POJO文件。此POJO将使用单独的键插入LinkedHashMap。目前,这个密钥只是使用一个简单的for循环生成。

package com.sample.pojos;

import java.util.Date;

public class DateSet {

public DateSet() {
    // TODO Auto-generated constructor stub
    super();
}

public DateSet(String trainingType, Date completedDate, Date expirationDate) {
    super();
    this.trainingType = trainingType;
    this.completedDate = completedDate;
    this.expirationDate = expirationDate;
}

private String trainingType;
private Date completedDate;
private Date expirationDate;



public String getTrainingType() {
    return trainingType;
}
public void setTrainingType(String trainingType) {
    this.trainingType = trainingType;
}
public Date getCompletedDate() {
    return completedDate;
}
public void setCompletedDate(Date completedDate) {
    this.completedDate = completedDate;
}
public Date getExpirationDate() {
    return expirationDate;
}
public void setExpirationDate(Date expirationDate) {
    this.expirationDate = expirationDate;
}




}

这是用于向LinkedHashMap添加值的Java代码。我使用了LinkedHashMap,因为我需要以正确的顺序访问项目。 HashMap的键是一个int,而值将是一个DateSet对象。

outHash.put(incrementedId, new DateSet(training.getTrainingType(), training.getCompletionDate(),
                    training.getExpirationDate()));

这是我用来处理HashMap的Drools规则。代码中的注释部分是我想在Drools中使用对象的方式。 “entry.getValue()”打印DateSet对象,但我无法访问其中的属性。

rule "Validate test"
agenda-group "validate_init"
    when
        someClass: SomeClass($tMap : outHash)                       
        entry : Entry($valueV : value) from $tMap.entrySet()  

        //Boolean(booleanValue == true) from ($valueV.getTrainingType() == "NEW")       

    then
    //System.out.println($valueV.getTrainingType());
    System.out.println(entry.getKey() + "-" + entry.getValue());
 end

1 个答案:

答案 0 :(得分:2)

此规则执行我认为您想要的(版本6.3.0):

rule "Validate test"
when
    SomeClass($tMap : outHash)                       
    e: Map.Entry(k:key, v:value) from $tMap.entrySet()
    DateSet( tt: trainingType == "NEW" ) from v 
then
    System.out.println(e.getKey() + "-" + tt);
end

然而,人们想知道为什么你没有将DateSet对象作为单独的事实插入,这使得访问和过滤非常容易。人工编号(递增的Id)不是数据的一部分,那么它的目的是什么?

修改 如果需要将一个DateSet对象与下一个DateSet对象进行比较(按日期排序),则应该向DateSet添加一个ordinal属性并插入DateSet对象。然后:

rule "check for overdue training"
when
    $ds1: DateSet( $ord1: ordinal, $exp: expirationDate )
    $ds2: DateSet( ordinal == $ord1+1, completedDate > $exp )
then
    // ds2 is too late
end

她的诀窍是,属性ordinal使您能够选择连续的DateSet对象对(因为它们是按日期排序创建和编号的):它将第一个与第二个进行比较,第二个与第三个进行比较,等等。 - 您可以添加trainingType == "NEW"或类似内容以供进一步选择。