gpt4 book ai didi

java - 结果集(getter/setter 类)对象在第二次执行时不删除旧值

转载 作者:行者123 更新时间:2023-12-02 06:55:54 24 4
gpt4 key购买 nike

我有 SummarizeData() 方法,并调用了很多次来检索值。但第一次是工作文件,但第二次执行值在 HashMap 中增加。

    void summarizeData() {

HashMap outerMap = new HashMap();

ArrayList list = new ArrayList(dataClass.getData());


for (int indx = 0; indx < list.size(); indx++) {
System.out.println("indx : " + indx);
Resultset rs = new Resultset();
rs = (Resultset) list.get(indx);


if (rs != null) {

int id = rs.getTestCaseNumber();
if (id > 0) {
Object isExists = outerMap.get(id);

if (isExists != null) {
//System.out.println("found entry so updating");
Resultset inRs = new Resultset();
inRs = (Resultset) isExists;

if (inRs != null) {
int totExec = inRs.getTestExecution();
int totPass = inRs.getTestCasePass();
int totFail = inRs.getTestCaseFail();

// System.out.println("totE :" + totExec + " totP:" + totPass + " totF:" + totFail);

int newRsStat = rs.getTestCasePass();

if (newRsStat == 1) {
totPass++;
inRs.setTestCasePass(totPass);
} else {
totFail++;
inRs.setTestCaseFail(totFail);
}
totExec++;

// System.out.println("id : "+id+" totPass: "+totPass+" totFail:"+totFail);
// System.out.println("key : " + id + " val : " + inRs.getTestCaseNumber() + " " + inRs.getTestCasePass() + " " + inRs.getTestCaseFail());

inRs.setTestExecution(totExec);
outerMap.put(id, inRs);
}

} else {

// System.out.println("not exist so new entry" + " totE:" + rs.getTestExecution() + " totP:" + rs.getTestCasePass() + " totF:" + rs.getTestCaseFail());
outerMap.put(id, rs);
}
}
} else {
System.out.println("rs null");
}


}

第一次执行时的输出:

indx : 0
indx : 1
indx : 2
indx : 3
indx : 4
indx : 5
indx : 6
indx : 7
indx : 8
indx : 9
indx : 10
totE :1 totP:1 totF:0
indx : 11
totE :1 totP:1 totF:0
indx : 12
totE :1 totP:1 totF:0
indx : 13
totE :1 totP:1 totF:0
indx : 14
totE :1 totP:1 totF:0
indx : 15
totE :1 totP:1 totF:0
indx : 16
totE :1 totP:1 totF:0
indx : 17
totE :1 totP:1 totF:0
indx : 18
totE :1 totP:1 totF:0
indx : 19
totE :1 totP:1 totF:0

第二次执行时的输出:

indx : 0
indx : 1
indx : 2
indx : 3
indx : 4
indx : 5
indx : 6
indx : 7
indx : 8
indx : 9
indx : 10
totE :2 totP:2 totF:0
indx : 11
totE :2 totP:2 totF:0
indx : 12
totE :2 totP:2 totF:0
indx : 13
totE :2 totP:2 totF:0
indx : 14
totE :2 totP:2 totF:0
indx : 15
totE :2 totP:2 totF:0
indx : 16
totE :2 totP:2 totF:0
indx : 17
totE :2 totP:2 totF:0
indx : 18
totE :2 totP:2 totF:0
indx : 19
totE :2 totP:2 totF:0

虽然我每次执行都需要相同的输出。

最佳答案

值正在递增,因为在以下行中:

totPass++;
inRs.setTestCasePass(totPass);

还有

totFail++;
inRs.setTestCaseFail(totFail);

还有

totExec++;
inRs.setTestExecution(totExec);

您通过 inRs 引用变量增加 testCasePasstestcaseFailtestexecution 值,该变量反射(reflect)在 isExists ,因此位于 outerMap 中存在的元素中。之所以如此,是因为所有变量(rsinRs 都共享同一个对象,即 outerMap.get(id) 处的对象)。这就是为什么每次调用 summarizeData 方法时,您都会获得递增的字段值。

更新
为了解决这个问题,您应该在 ResultSet 类中使用复制构造函数,如下所示:

public ResultSet(ResultSet rs)
{
testCasePass = rs.getTestCasePass();
testCaseFail = rs.getTestCaseFail();
testExecution = rs.getTestExecution();
}

当您创建 inRs 时,请使用以下行:

ResultSet inRs = new ResultSet(isExists);

更新

并且不要将 inRs 放入 outperMap

关于java - 结果集(getter/setter 类)对象在第二次执行时不删除旧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17362459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com