2017-02-01 3 views
1

У меня есть 2DArrayList как:значения массива изменить вне цикла - Java

private ArrayList<double[]> allNeuronsParams = new ArrayList<double[]>(); 

Я пытаюсь присвоить значения его внутри цикла:

for (int i = 0; i < getTotalNeuronNum(); i++) { 

     allNeuronsParams.add(defaultParamCase1);  //this is fine 

     setNeuronParam(i, 0, (double)NMassociatedNum); //this is fine 

     setNeuronParam(i, 1,extractedNeuronTypes[i]); //this is the problem 
    } 

Проблема с моим последним назначением внутри цикла:

 setNeuronParam(i, 1,extractedNeuronTypes[i]); 

Эта строка присваивает значения от extractedNeuronTypes до второго индекса каждой строки allNeuronsParams 2-D ArrayList через функцию setNeuronParam(row, index, value).

Когда я печатаю значения внутри цикла, все правильно. Но когда я поставил оператор печати после цикла, значения уже не верны.

Значения, которые печатаются, - это все 3, что является значением по умолчанию для массива extractedNeuronTypes. До цикла for for я вызываю другую функцию, открываю файл и читаю новые значения в этом массиве - не для всех индексов, а для части из них значения изменяются. Например, значения изменяются от значений по умолчанию {3, 3, 3, 3} до новых значений {3, 2, 1, 3}.

Но по каким-либо причинам доступен только {3, 3, 3, 3}. Еще раз я печатаю значения внутри цикла, а правильные числа {3, 2, 1, 3} назначаются двумерному массиву.

Но вот что я получаю после цикла - полужирный числа являются неправильными, все остальное в порядке:

Мои параметры: 1,0, 3,0 , -1,0, -2,345, 1,0, 1432345,1, -13456.0, -1,4, 2,000003, 2,000003, 2,000003, 2,000003

Мои параметры: 1.0, 3.0 , -1,0, -2,345, 1,0, 1432345,1, -13456,0, -1,4, 2,000003, 2,000003, 2,000003 , 2.000003

Мои параметры: 1.0, 3.0 , -1,0, -2,345, 1,0, 1432345,1, -13456,0, -1,4, 2,000003, 2.000003, 2,000003, 2,000003

Мои параметры: 1.0, 3.0 , -1,0, -2,345, 1,0, 1432345,1, -13456,0, -1,4, 2,000003, 2,000003, 2,000003, 2,000003

Может кто-нибудь увидеть, что я здесь не так?

спасибо.

+0

В чем главная проблема? это не истинный способ задать вопрос ... –

+0

Нормально ли, что все остальные значения идентичны? Вы уверены, что значение правильно прочитано (вы его распечатали, чтобы убедиться)? – AntonH

+0

Привет, извините, первый раз задавая вопрос! Я присваиваю значения arraylist внутри цикла, а часть его изменяется вне цикла – fatima

ответ

0

Похоже, что все ваши строки ссылаются на один и тот же массив (defaultParamCase1).

а не делать

allNeuronsParams.add(defaultParamCase1); 

вы должны создать глубокую копию defaultParamCase2, и добавить эту копию в ArrayList

+0

Значения двойного массива defaultParamCase1 устанавливаются внутри другого метода, и я устанавливаю индекс 0 и от 1 до -1 - defaultParamCase1 [0] = -1; \t defaultParamCase1 [1] = -1; Значит, он не должен печатать -1 вместо 3, если это так? – fatima

+0

Можете ли вы опубликовать метод setNeuronParam? –

+0

Это метод: 'общественного недействительными setNeuronParam (интермедиат neuronIndex, Int paramIndex, двойной paramValue) { \t \t \t \t allNeuronsParams.get (neuronIndex) [paramIndex] = paramValue; \t} ' – fatima

0

OK - Спасибо всем за вашу помощь.Наконец я понял, в чем проблема. Некоторые из вас действительно упомянули об этом, хотя мне потребовалось некоторое время, чтобы понять это.

Я хотел бы добавить один и тот же массив несколько раз к моему списку массивов; однако я не знал, что даже в этом случае нам нужно создать новое пространство для каждой строки массиваList - учитывая, что myListList является 2-D.

Так в начале моего метода я добавил следующую строку:

allNeuronsParams.add(new double[getNumOfParams(defaulParamFilePath)+2]);

До этого я использовал один массив, и я добавлял, что один массив несколько раз, так что все ссылки указывали на тот же массив и только значения из последних итераций сохранялись и печатались.

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