2013-06-20 9 views
-2

У меня есть следующий фрагмент кода:Почему значения не совпадают?

public int[][][] arrMethod1(){ 
    for (int idx=0;idx< x;idx++){ 
     arr[idx]=arrMethod2(); 
     System.out.println("arr "+idx+" is "+Arrays.toString(arr[idx][0])); 
     } 
    System.out.println("arr0 are "+Arrays.toString(arr[0][0])); 
    System.out.println("arr1 are "+Arrays.toString(arr[1][0])); 
    return arr; 
} 

Когда эта часть кода выполняется, отличный результат, полученный в течение для цикла и отличается снаружи. Похоже, что arr[0][0] совпадает с arr[1][0], что неверно в цикле for. myMethod() - это метод, который инициализирует arr[idx] с 2D-массивом. Для моего тестирования для простоты я использовал массив 1D и x=2. Цель состоит в том, чтобы иметь x разные arr, которые представляют собой 3D-массивы. Остальная часть кода:

private final int[][] arrMethod2(){ 
    final int[] otherArr=arrMethod3(); 
     for (int idz=0;idz< z;idz++){ 
      int[] toBe=new int[otherArr.length]; 
      System.arraycopy(otherArr, 0, toBe, 0, otherArr.length); 
      newArr2[idz]=change(toBe); 
    } 
    return newArr2; 
} 

public int[] arrMethod3(){ 
    for (int idy = 0; idy < y; idy++){ 
      double randomInt = randomGenerator.nextDouble(); 
      newArr3[idy]=(int) Math.round(randomInt); 
    } 
    return newArr3; 

public MyClass(int x,int y, int z){ 
    this.x=x; 
    this.y=y; 
    this.z=z; 
    this.newArr3 = new int[y]; 
    this.newArr2 = new int[z][y]; 
    this.arr = new int[x][z][y]; 
} 
+11

Мы не знаем, что 'MyMethod()' делает, что делает его очень трудно, чтобы помочь вам. Пожалуйста, предоставьте краткую, но * полную * программу, которая демонстрирует проблему. –

+0

Ваша программа очень расплывчата. что такое X? ваш arr является 2-мерным массивом, похоже, вы понимаете, что arr [0] является массивом с 1-D? – tejas

+0

Также 'arr' представляет собой переменную экземпляра класса, которая знает, что с ней происходит, вы касаетесь ее в myMethod или в каком-либо другом месте? –

ответ

1

Ваш код создает самый внутренний массив (newArr3) ровно один раз, а затем меняет только значения внутри этого массива. Вам нужно создать новый для каждого вызова.

Измените метод arrMethod3 так:

public int[] arrMethod3(){ 
    int[] retVal = new int[y]; // THIS IS THE IMPORANT LINE 
    for (int idy = 0; idy < y; idy++){ 
     double randomInt = randomGenerator.nextDouble(); 
     retVal[idy]=(int) Math.round(randomInt); 
    } 
    return retVal; 
} 

Вам нужно будет делать то же самое для newArr2arrMethod2), а также.

Причина в том, что вы перезаписываете уже прошедшие значения. Как это:

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

Но что вам нужно сделать, это: (! Только самый внешний один)

  • инициализации класса, определяют внешний массив
  • внешний контур обращается внешний массив и вызывает внутренний метод
    • внутренний метод создает новый массив и заполняет его новыми данными

Таким образом, каждый раз, когда вы вызываете внутренний метод, у вас будут новые массивы.

Подумайте об этом как о доме с комнатами, каждая комната может содержать только одну вещь, если вы пройдете через дом и поместите стол в каждую комнату, а затем снова перейдете через один и тот же дом и замените стол табуретом; то в конце концов у вас будет дом с табуретами.

Если вы вместо этого наполните дом рабочими столами, а затем перейдите к следующему дому и заполните его табуретами, вы получите два дома с различным содержанием.

(В этом примере номер ваш arrMethod3, дом arrMethod2 и внешний массив является улица)

+0

Вы можете разработать PLS? Я добавил больше своего кода ... – JustCurious

+0

@JustCurious в порядке, так и есть. Вам нужно поместить строку 'int [] newArr3 = new int [y];' в 'arrMethod3()' Я обновлю свой ответ. –

+0

@JustCurious, пожалуйста, см. Мое редактирование, я объясню немного глубже в один момент. –

1

Если myMethod не создает новый массив (new int[][] и new int[]), но повторно один и тот же объект памяти, то тот же объект поместить в arr[0] и arr[1]. Всегда заполняется новыми значениями; последние перезаписывают более ранние.

+0

i инициализируйте 'arr' в конструкторе класса следующим образом this.arr = new int [x] [z] [y]; – JustCurious

+0

Тогда одномерный массив 'arr [idx] [0]', возможно, не должен быть заменен на 'myMethod'. Измените его на 'void myMethod (int [] a)'. –

+0

'arr [idx] [0]' содержит адрес одномерного массива. Этот адрес был результатом первоначального нового. 'arr [idx] [0] = ...' перезаписывает этот адрес. Вероятно, 'myMethod' (re) использует один единственный глобальный' int [] 'и возвращает свой адрес. Вызов 'arr [idx] [0]' и 'arr [idx] [1]' для указания того же адреса. –

0

Просто уточнить, если я правильно понял из вашего описания, вне цикла arr[0][0] & arr[1][0] равны. Это означает, что они равны даже внутри цикла. Но то, что вы говорите, неверно, то есть arr[0][0] == arr[1][0] не означает, что arr[0] = arr[1], это означает, что 0-й элемент этих двух массивов равен. Отвечает ли это на ваш вопрос? или, по крайней мере, разъяснить это?

+0

'arr [0] [0]' не должно быть равно 'arr [1] [0]. Это происходит внутри цикла, что является правильным. Вне цикла, arr [0] [0] является тем же самым, что и arr [1] [0], что неверно, и это то, что я не понимаю, почему мы это делаем. – JustCurious

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