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

时间:2014-12-10 22:16:50

标签: java arrays json jsonobject

我正在编写一个程序来收集排序算法的计数器结果。我将值存储在JSONObject中,以便我可以计算平均值等等。

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,“description”:“Best Case”,“numofcounters”:2,“testresults”:{“1000”:[998,0]}}}

第二个输出正确添加..

  

{“inSort”:{“repetitionspertest”:100,“description”:“Best Case”,“numofcounters”:2,“testresults”:{“1000”:[[998,0],[998,0] ]}}}

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

  

{“inSort”:{“repetitionspertest”:100,“description”:“Best Case”,“numofcounters”:2,“testresults”:{“1000”:[[1998,0],[1998,0] ]], “2000”:[1998,0]}}}

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

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

请有人提出解决方案吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

问题在于调用addCounters()的方法。您在参数long[] counters中传递的引用正在初始化一次到new long[2]并错误地重复使用。每次执行排序算法时,必须将变量初始化为新的长数组。