Какой лучший способ установить все значения трехмерного массива в ноль в Java?

У меня есть трехмерный массив, который я хочу, чтобы reset равнялся нулю. Кажется, что должен быть простой способ сделать это, что не включает три цикла for:

for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
        for (int k = 0; k < n; k++) {
            cube[i][j][k] = 0;
        }
    }
}

Ответ 1

Если вы используете JDK 1.5 или выше:

    for (int[][] square : cube) {
        for (int[] line : square) {
            Arrays.fill(line, 0);
        }
    }

Ответ 2

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

int[][][] cube = new int[10][20][30];

Это вы также можете сделать позже, до reset их массив до нуля, это не ограничивается объявлением:

cube = new int[10][20][30];

Просто создайте новый массив, он инициализируется нулями. Это работает, если у вас есть одно место, в котором содержится ссылка на массив. Не волнует старый массив, который будет собирать мусор.

Если вы не хотите зависеть от этого поведения языка или не можете заменить все вхождения ссылок на старый массив, вы должны пойти с Arrays.fill(), как упоминалось в jjnguy:

for (int i = 0; i < cube.length; i++)
{
   for (int j = 0; j < cube[i].length; j++)
   {
      Arrays.fill(cube[i][j], 0);
   }
}

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

Ответ 3

Ну, похоже, что вы можете просто отказаться от старого массива и создать новый:

int size = 10;
cube = new int[size][size][size];

Ответ 4

for (int i = 0; i < arr.length; i++){
    for (int j = 0; j < arr[i].length){
        Arrays.fill(arr[i][j], 0);
    }
}

Таким образом вы избавитесь от одного дополнительного цикла, используя Arrays.fill;

или

arr = new double[arr.length][arr[0].length][arr[0][0].length];

К сожалению, это предполагает, что массив не менее length >= 1.

Ответ 5

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

Если во внутреннем цикле было действительно только три элемента, и вы хотели подчеркнуть, что существует три столбца, вы можете попробовать следующее:

for (int i = 0; i < n; i++) { 
    for (int j = 0; j < n; j++) { 
        cube[i][j][0] = 0; 
        cube[i][j][1] = 0; 
        cube[i][j][2] = 0; 
    }
}

Ответ 6

Ну, вы всегда можете это сделать:

Arrays.fill(cube[0][0],0);
Arrays.fill(cube[0],cube[0][0]);
Arrays.fill(cube,cube[0]);

Это немного чище, чем 3 петли.

Если вы не поняли эту идею, первая "заливка" заполняет одно измерение. Второе заполнение копирует одно измерение в двух измерениях. Третье заполнение копирует два измерения по трем измерениям.

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

Ответ 7

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

cube = new int[cube.length][cube[0].length][cube[0][0].length];

Или вы могли бы сделать

for(int[][] tda : cube ) {
  for(int[] oda : tda) {
    java.util.Arrays.fill(oda, 0);
  }
}

Ответ 8

Просто создайте новый массив и назначьте ему переменную... GC очистит старый массив