我的班级TextPlan
中有一个方法,它在另一个班级RSTRule
中调用我的所有规则,并将所有规则添加到数组列表中。对于这个方法我使用了import java.lang.reflect.InvocationTargetException and
import java.lang.reflect.Method .
But it adds to the array list incorrectly. For example, the result of
add(RSTRule)`在RST方法的每次调用中如下:
call 1: RSTRules.add(RSTRule)=R1
call 2: RSTRules.add(RSTRule)=R2,R2
call 3: RSTRules.add(RSTRule)=R3,R3,R3
call 4: RSTRules.add(RSTRule)=R4,R4,R4
这意味着每次添加新元素时,它都会从数组列表中删除前面的元素,但会重复新元素。
这是我的代码:
public class TextPlan extends ArrayList<Object> {
RSTRules rstRules=new RSTRules();
public RSTRules produceAllRSTRules(RSTRules rstRules) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException {
RSTRule rstRule=new RSTRule();
Method[] methods =rstRule.getClass().getMethods();
for (Method method : methods) {
if (method.getName().startsWith("generate")) {
rstRule=(RSTRule)method.invoke(rstRule);
rstRules.add(rstRule) ;
}
}
return rstRules;
}
}
我在“RSTRule”中的一个方法,我在“TextPlan”中调用所有这些方法来生成所有规则的实例;
public class RSTRule{
protected String ruleName;
protected DiscourseRelation discourseRelation;
protected String ruleNucleus;
protected String ruleSatellite;
protected String condition;
int heuristic;
public RSTRule generateBothAppearBothCosts_Join(){
this.discourseRelation=DiscourseRelation.Join;
this.ruleNucleus="BothProductAppear_Elaboration";
this.ruleSatellite="BothProductCost_Elaboration";
this.ruleName="BothProductAppearAndBothProductCost_Join";
this.condition=null;
this.heuristic=9;
return this;
}
}
答案 0 :(得分:5)
您没有向列表中添加四个新的RSTRule
实例,您将添加相同的RSTRule
实例四次并每次修改它。由于存储了四次相同的实例,因此修改会显示在列表的每个位置。