Java 为什么JSONObject.acculate()会影响其他键的值?
我正在写一个程序,收集排序算法的计数器结果。我将这些值存储在JSONObject中,以便稍后计算平均值等Java 为什么JSONObject.acculate()会影响其他键的值?,java,arrays,json,jsonobject,Java,Arrays,Json,Jsonobject,我正在写一个程序,收集排序算法的计数器结果。我将这些值存储在JSONObject中,以便稍后计算平均值等 public void addCounters(String sortName, Integer arraySize, long[] counters){ results.getJSONObject(sortName).getJSONObject("testresults").accumulate(arraySize.toString(), counters); System
public void addCounters(String sortName, Integer arraySize, long[] counters){
results.getJSONObject(sortName).getJSONObject("testresults").accumulate(arraySize.toString(), counters);
System.out.println(results);
}
如您所见,它应该将每个结果附加到应用于它的键
第一个输出是正确的
{“inSort”:{“repetitionpertest”:100,“description”:“Best Case”,“numofcounters”:2,“testresults”:{“1000”:[998,0]}}
第二个输出正确追加
{“inSort”:{“repetitionpertest”:100,“description”:“Best Case”,“numofcounters”:2,“testresults”:{“1000”:[[998,0],[998,0]]}
但当添加一个新密钥时,它会更改所有数组。即使是用不同钥匙的
{“inSort”:{“repetitionpertest”:100,“description”:“Best Case”,“numofcounters”:2,“testresults”:{“1000”:[[1998,0],[1998,0]],“2000”:[1998,0]}
您可以看到键“1000”中的值正在更改为1998,而不是998。
我甚至尝试过编写自己的.acculate()方法的等价物,但没有效果
我假设这与在内存中引用相同的数组有关,但我不知道如何解决这个问题
请问谁能提出一个解决方案
提前谢谢 问题在于调用
addCounters()
的方法。您在参数long[]counters
中传递的引用被初始化一次为new long[2]
,并被错误地重用。每次执行排序算法时,必须将变量初始化为新的长数组。这是因为“1000”和“2000”使用相同的对象。非常好,非常感谢。经过多次修补,我还发现用counters.clone()替换计数器也很有效。