2014-12-10 3 views
0

Я пишу программу, которая собирает результаты счетчика алгоритма сортировки. Я сохраняю значения в 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». –

ответ

0

Проблема в вашем методе, который вызывает addCounters(). Ссылка, которую вы передаете параметру long[] counters, инициализируется один раз до new long[2] и ошибочно используется повторно. Вы должны инициализировать переменную в новый длинный массив каждый раз, когда вы выполняете алгоритм сортировки.

+0

Отлично, спасибо. После долгих переделок я также обнаружил, что замена счетчиков с помощью counters.clone() тоже работала. – boiiocks

Смежные вопросы