2013-04-01 3 views
1

Проблема

Массив перезаписывается без видимой причины


я написал цикл, в котором я заполнить массив с объектами Sum. Все работает нормально, но как только цикл переходит к следующей итерации, он перезаписывает первый индекс массива.


Что есть я пытался


Я попытался посмотреть, может быть, моя проблема заключается в другом фрагменте кода (например, мой класс Sum). Но не мог найти ничего, что могло бы нарушить цикл.
Я попытался найти другие переменные с тем же именем (даже в других методах, так как я был в отчаянии) и посмотреть, могу ли я изменить свой итератор где-то еще. Я не мог найти ничего подобного.
Я пробовал оглядываться по интернету и так найти что-то, связанное с случайным переписыванием массивов, но ничего не мог найти.


Код


public Task(Object[] parameters) 
{ 
    this.number_of_sums = Integer.parseInt((String)parameters[0]); 
    this.variables_per_sum = Integer.parseInt((String)parameters[1]); 
    this.sum_parameters = new Object[this.variables_per_sum]; 
    this.sums = new Sum[this.number_of_sums]; 
    int z = 0; 

    for(int i = 0; i < this.number_of_sums; i++) 
    { 
     int x = 0; 
     for(int j = (2 + z); j < ((this.variables_per_sum + 2) + z); j++) 
     { 
      this.sum_parameters[x] = parameters[j]; 
      x++; 
     } 

     this.sums[i] = new Sum(this.sum_parameters); 

     System.out.println("Index 0: "+sums[0]); //1st iteration: 1 + 1 //2nd iteration: 2 - 1 
     System.out.println("Index 1: "+sums[1]); //1st iteration: null //2nd iteration: 2 - 1 

     z += this.variables_per_sum; 
    } 
} 


Ожидания


Я ожидаю выход 1 + 1 и 2 - 1. Однако я получив следующее: 2 - 1 и 2 - 1, когда я закончил.

Если кто-то видит что-либо, что я делаю неправильно, или хотел бы видеть дополнительную информацию или код на моей стороне, скажите об этом. Заранее спасибо.

+2

Ваш код трудно следовать. Лучшая ставка? Пройдите в отладчике и посмотрите, что происходит. Вы выясните это быстрее, чем получить ответ здесь. – duffymo

+1

Все ваши 'Sum' используют один и тот же массив (' this.sum_parameters'). Вы должны сделать новый на каждую основную итерацию. – Esailija

+0

@Esailija Что вы подразумеваете под этим? Я хочу, чтобы каждый 'Sum' хранился в том же массиве, только с другим индексом (конечно). Как я могу предотвратить это? @duffymo Спасибо, я понимаю, что код трудно выполнить (хотя он работает так, как предполагается, за исключением хранения результатов в массиве). Мой единственный вопрос заключается в том, почему 'Sum' сохраняется в каждом индексе вместо одного индекса. – Bono

ответ

3

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

Похоже, что все объекты Sum будут иметь один и тот же массив - вы передаете одну и ту же ссылку каждый раз, когда строите Sum. Кроме того, каждый раз, когда вы перебираете j, вы переписываете содержимое этого массива.

Итак, когда все сделано, все суммы одинаковы.

Вы должны быть в состоянии обойти эту проблему, давая каждому Sum различное sum_parameters:

public Task(Object[] parameters) 
{ 
    this.number_of_sums = Integer.parseInt((String)parameters[0]); 
    this.variables_per_sum = Integer.parseInt((String)parameters[1]); 
    this.sums = new Sum[this.number_of_sums]; 
    int z = 0; 

    for(int i = 0; i < this.number_of_sums; i++) 
    { 
     Object[] sum_parameters = new Object[this.variables_per_sum]; 
     int x = 0; 
     for(int j = (2 + z); j < ((this.variables_per_sum + 2) + z); j++) 
     { 
      sum_parameters[x] = parameters[j]; 
      x++; 
     } 

     this.sums[i] = new Sum(sum_parameters); 

     System.out.println("Index 0: "+sums[0]); //1st iteration: 1 + 1 //2nd iteration: 2 - 1 
     System.out.println("Index 1: "+sums[1]); //1st iteration: null //2nd iteration: 2 - 1 

     z += this.variables_per_sum; 
    } 
} 
+0

Спасибо, решил принять это как ответ, потому что он немного более подробный и имеет пример кода. – Bono

1

Каждый из ваших Sum объектов строится с this.sum_parameters в качестве параметра:

this.sums[i] = new Sum(this.sum_parameters); 

Когда sum_parameters изменяется в каждой итерации внешнего цикла, она изменяет внутренне в объектах, построенных вокруг ссылок на него ,

Вы должны сделать внутреннюю копию sum_parameters в каждом объекте Sum.

+0

Большое спасибо, ясное объяснение заставил меня понять. Теперь я думаю об этом. – Bono