为什么JSONObject.accumulate()影响其他键的值?

问题描述:

我正在写一个程序,收集排序算法的计数器结果。我将值存储在JSONObject中,以便稍后可以计算平均值等。为什么JSONObject.accumulate()影响其他键的值?

public void addCounters(String sortName, Integer arraySize, long[] counters){ 
    results.getJSONObject(sortName).getJSONObject("testresults").accumulate(arraySize.toString(), counters); 
    System.out.println(results); 
} 

正如你所看到的,它应该将每个结果附加到适用于它的键上。

第一输出是正确..

{ “inSort”:{ “repetitionspertest”:100, “说明”: “最佳情况”, “numofcounters”:2 “testresults”:{” 1000 “:[998,0]}}}

第二输出正确地追加..

{” inSort “:{” repetitionspertest “:100,” 说明 “:” 最佳情况” ,“numofcounters”:2,“testresults”:{“1000”:[[998,0],[998,0]]}}}

但是,当添加新密钥时,它会更改所有数组。即使在不同密钥的那些..

{ “inSort”:{ “repetitionspertest”:100, “说明”: “最佳情况”, “numofcounters”:2 “testresults”:{ “1000”: [1998,0],[1998,0], “2000”:[1998,0]}}}

你可以看到,在关键的 “1000” 的值更改为1998年,而不是998 我甚至尝试将自己的等价物写入.accumulate()方法,但无济于事。

我假设这是在内存中引用相同的数组,但我不知道如何解决这个问题!

请问任何人都可以提出解决方案吗?

提前致谢!

+0

这是因为您对“1000”和“2000”使用相同的对象。 – 2014-12-10 22:28:38

问题出在您的方法,调用addCounters()。您在参数long[] counters中传递的参考正被初始化为new long[2],并且被错误地重新使用。每次执行排序算法时,都必须将该变量初始化为新的长阵列。

+0

非常好,非常感谢。经过多次修补之后,我还发现用counters.clone()替换柜台也起作用。 – boiiocks 2014-12-11 23:29:17