Заполнить 3-мерный массив случайными числами от 0 до 1

277
23 сентября 2017, 21:37

Пытаюсь заполнить трёхмерный массив случайными числами от 0 до 1:

//объект класса Random
Random random = new Random();
//создаём трёхмерный массив(3 столбца, 3 ряда)
int[][][] array = new int[3][3][3];
//заполняем его случайными значениями
for(int i = 0 ; i < array.length; i++ ){
    for(int j = 0 ; j < array[i].length; j++ ){
        for(int k = 0; k < array[j].length; k++) {
            array[i][j][k] = random.nextInt(1);
        }
    }
}
System.out.println(Arrays.toString(array));

В конце программа должна вывести массив в виде строки, но выводит это:

[[[I@74a14482, [[I@1540e19d, [[I@677327b6]

Как исправить?

Answer 1

Этот вывод вполне логичен.

Лучше, конечно, написать для этого отдельный метод, и делать это в цикле.

Или использовать готовые/другие способы из других ответов. Ниже объясняю, в чём проблема.

Метод Arrays.toString обходит массив не рекурсивно, он пробежался в цикле по самому верхнему массиву и для каждого его элемента вызвал String.valueOf(a[i]), а каждый элемент - это двумерный массив. Ведь трехмерный массив это массив двумерных массивов, то есть массив массивов одномерных массивов :) А ошибки не было потому, что трехмерный массив это тоже одномерный массив, только его элементы тоже массивы.

Answer 2

Вам поможет Arrays.deepToString(array)

Answer 3
array[i][j][k] = random.nextInt(1);

Этот код заполнит ваш массив только 0, т.к. метод nextInt на вход принимает границу невключительно. В вашем случае нужно передать 2 - тогда в массиве будут 0 и 1.

Как писали ранее для вывода массива вы можете:
1. Обойти массив таким же способом как вы его заполняли (либо выводить значение сразу после заполнения

for(int i = 0 ; i < array.length; i++ ){
    for(int j = 0 ; j < array[i].length; j++ ){
        for(int k = 0; k < array[j].length; k++) {
            array[i][j][k] = random.nextInt(2);
            System.out.print(array[i][j][k] + " ");
        }
        System.out.println();
    }
    System.out.println();
}

1 1 1
1 1 1
1 0 0

0 1 0
1 1 0
0 1 1

0 1 0
0 0 1
0 1 1

2.Использовать Arrays.deepToString(array):

System.out.println(Arrays.deepToString(array));  

[[[1, 1, 1], [1, 1, 1], [1, 0, 0]], [[0, 1, 0], [1, 1, 0], [0, 1, 1]], [[0, 1, 0], [0, 0, 1], [0, 1, 1]]]

3.Извращаться с помощью stream-ов :) (делать этого, конечно, не стоит)

Arrays.stream(array)
        .flatMap(Arrays::stream)
        .map(Arrays::stream)
        .map(IntStream::boxed)
        .map(s -> s.map(String::valueOf).collect(Collectors.joining(" ")))
        .forEach(System.out::println);

1 1 1
1 1 1
1 0 0
0 1 0
1 1 0
0 1 1
0 1 0
0 0 1
0 1 1

READ ALSO
Как происходит вызов show?

Как происходит вызов show?

Как происходит вызов show ? makeText статичный метод, с ним все понятно, но как дальше вызывается show ? ведь он не статичный а объект создан не был

227
Что делать с проблемой вложенном меню на мобильных версиях?

Что делать с проблемой вложенном меню на мобильных версиях?

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

230
как сделать ширину страницы в шаблоне под область просмотра?

как сделать ширину страницы в шаблоне под область просмотра?

Как в этом шаблоне https://scriptedencom/previews/Clean/ сделать ширину страницы под область просмотра?

323