Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么JSONObject.acculate()会影响其他键的值?_Java_Arrays_Json_Jsonobject - Fatal编程技术网

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

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

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

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()替换计数器也很有效。