为什么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()方法,但无济于事。
我假设这是在内存中引用相同的数组,但我不知道如何解决这个问题!
请问任何人都可以提出解决方案吗?
提前致谢!
问题出在您的方法,调用addCounters()
。您在参数long[] counters
中传递的参考正被初始化为new long[2]
,并且被错误地重新使用。每次执行排序算法时,都必须将该变量初始化为新的长阵列。
非常好,非常感谢。经过多次修补之后,我还发现用counters.clone()替换柜台也起作用。 – boiiocks 2014-12-11 23:29:17
这是因为您对“1000”和“2000”使用相同的对象。 – 2014-12-10 22:28:38