Здравствуйте, давно застрял на массивах. Объясните если не трудно, вот когда заполняем многомерный массив через цикл, мы же пишем команду lenght, но как там измеряется длинна какая то, если это в виде таблицы всё? Как программа понимает что там есть длинна, что ширина? Уже голову сломал, на 6 уровне 6 лекции вообще встал, особенно там где например написано
int[][] matrix = new int[3][];
matrix[0] = new int[]{1, 2, 3, 4, 5, 6};
matrix[1] = new int[]{1, 2, 3};
matrix[2] = new int[]{1};
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++)
System.out.print( matrix[i][j] + " " );
System.out.println();
}
Там же вначале индекс например [3][]
То есть вторая скобка пустая, как это может быть многомерным массивом? если во второй ничего нет, ничего не понимаю.
Всё шло хорошо, но тут вообще в ступор впал.
Киселёв Роман Олегович
6 уровень
Тема массивов сломала мозг.
Комментарии (17)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Павел
4 марта 2023, 10:49
Двигайся дальше, многомерные массивы это далеко не самая востребованная функциональность в Java.
Потом вернешься к этой теме если будет нужда.
0
Киселёв Роман Олегович
7 марта 2023, 08:10
Хотелось бы, но ведь в задачах дальше эти же темы есть.
0
Денис Java Developer
4 марта 2023, 10:37
Массив это объект. Длина массива определяется во время инициализации это свойство объекта.
Инициализация вида new int[3][] означает что у тебя двухмерный массив из трех элементов. Что такое двухмерный массив? Это массив массивов. Потому число во второй скобке не очень то и обязательно, особенно если тебе нужно хранить массивы разной длинны. Просто элементы этого массива еще не инициализированы - null
Если бы ты написал new int[3][3] то ты получил бы массив с тремя массивами int'ов, по три элемента в каждом (каждый элемент был бы равен нулю).
Ну а в циклах ты уже обращаешься к свойству length у каждого конкретного массива после того как руками присвоил фактические значения своей матрице. Внешний цикл берёт длинну внешнего массива, вложенный длинну текущего элемента взятого по индексу.
Кстати, если говорить о математических матрицах, то там не бывает строк разной длины ) она всегда прямоугольной формы, потому называть ассиметричный двухмерный массив матрицей не совсем и корректно как по мне.
0
Киселёв Роман Олегович
7 марта 2023, 08:10
А как lenght работает на многомерных массивах? я понимаю на одномерных. А тут у меня мозг это отказывается понимать. Если у программы нет длинны и ширины как мы себе это в виде таблицы представляем, как там длинна измеряется? Это будет длинна внешнего или внутреннего массива? ничего тут понять не могу.
0
Денис Java Developer
7 марта 2023, 09:15
Когда ты в супермаркете берёшь пакет на 10 килограм, какая у него грузоподъемность? Там же нет ничего еще, откуда ты знаешь?
Когда массив есть у него есть длина, всё.
int[][] array = new int[3][3]
array.length - длина внешнего массива
array[0].length - длина массива в нулевом индексе.
Если у тебя такая запись
int[][] array = new int[3][]
то
array[0].length выкинет NullPointerException потому как никакого массива в нулевом индексе еще не определено (как и во всех остальных в данном случае). Вызывать методы или обращаться к свойствам null нельзя.
Да и переставай ты думать о многомерных массивах как о таблицах, ничего общего с таблицами они не имеют. Это просто вложенные хранилища. Коробка, в ней другие коробки, в них могут быть третьи коробки. В отличие от реального мира объем вложенных коробок может быть даже больше объема внешних, ну да это условности, представь что ты в книге про Гарри Поттера, где в палатку влазит дворец.
0
it
4 марта 2023, 07:58
Ща немного сумбурно, но попробую рассказать)) если че задавай вопросы..
многомерный массив это тот массив который хранит ссылки на другие массивы, а не сразу на значение..
new int[2] - делая так ты показываешь что хочешь создать массив из двух ячеек, который в каждой своей ячейке хранит ссылки на значения.
инициализация начинается с ноля:
new int[0] -> например значение 5;
new int[1] -> 6;
new int[2][3] - а так показываешь что хочешь создать массив из двух ячеек, который хранит в каждой своей ячейке ссылку на еще 1 массив, который в свою очередь хранит одну ячейку в который ссылка на значение.
new int[0] -> new int[0] -> значение 5;
new int[0] -> new int[1] -> 6;
new int[0] -> new int[2] -> 7
new int[1] -> new int[0] -> значение 8;
new int[1] -> new int[1] -> 9;
new int[1] -> new int[2] -> 10;
а если так:
new int[3][] - то тут ты показываешь что хочешь создать массив из 3 ячеек который хранит в каждой своей ячейке еще 1 массив, но тот массив просто без конкретного указания длинны.
а вот тут задаешь значения без конкретного указания длинны.
new int[0] -> new int[]{1,2,3,4};
new int[1] -> new int[]{1,2,3,4,5};
new int[2] -> new int[]{1,2,3};
0
it
4 марта 2023, 07:58
Смотри вот есть такой массив:
int[] array = new int[]{1,2,3,4,5};
смущает? или норм, то что не задана длинна?
- это норм, т.к. java сама поймет что я создал массив на 5 ячеек.
То есть одномерный массив это коробка с ячейками которая хранит ссылки на значения
0
it
4 марта 2023, 07:59
Двумерный массив это коробка с ячейками которая хранит в каждой своей ячейке еще 1 массив, который в свою очередь хранит ссылки на значения
0
it
4 марта 2023, 08:00
Трехмерный массив это коробка с ячейками которая хранит, в каждой своей ячейке еще 1 массив, где массив который хранится - хранит еще 1 массив, который уже хранит ссылки на значения...
0
it
4 марта 2023, 08:01
То есть забей на понятие ширина,
это кому как легче воспринимать...
любой многомерный массив это просто определенное кол-во вложенных массивов как матрешка
0
it
4 марта 2023, 08:08
конкретно по примеру:
тут создан двумерный массив.
то есть значит что в каждой ячейке основного(скажем так) массива, будет хранится еще массив, длинну которого мы не указываем конкретно, но задаем значения, где java сама поймет какая длинна у каждого внутреннего массива...
например:
new int[3][]; - показывает что создан массив состоящий из трех ячеек, и в
каждой ячейке хранится по массиву, но без указания длинны при инициализации.
а вот тут:
- добовляем в каждую ячейку по массиву:
matrix[0] = new int[]{1,2,3,4,5,6};
- затем во вторую
matrix[1] = new int[]{1,2,3}; и т.д. 0
it
4 марта 2023, 08:12
- ну представляй не в виде таблицы)))
а в виде строки, таблицу ты сам рисуешь когда делаешь println - переход на новую строку
можно же отрисовать все на одной строке..
0
it
4 марта 2023, 08:17
да ничего она не понимает))
это ты сам так решил))
программа думает так:
- ага есть массив new[3][]
- ага он двумерный
- значит он хранит не ссылки на значения, а массив, который в свою очередь хранит ссылки на значения..
- ага длина 1го(внешнего) массива 3, а длина 2го(внутреннего) равна кол-ву элементов, которое занесено в первую ячейку внешнего массива так - new int[]{1,2,3,4,5,6} то есть длинна внутреннего равна - 6(кол-во элементов).
0
Киселёв Роман Олегович
7 марта 2023, 08:00
То есть если есть массив new[3][]
То в пустых скобках(внутренний массив) та же цифра, что и в заполненных(внешний).
Так? а то я больше всего не понимаю вот именно эту вот тему с одной заполненной скобкой и одной пустой, типа как мне понять какое число в пустой.
0
Киселёв Роман Олегович
7 марта 2023, 08:07
И выходит если у меня такой массив new[3][]
То всегда я вручную должен указать сам длину внутреннего массива?
0
it
7 марта 2023, 09:24
нет.
перечитай лекции еще раз внимательно, я посмотрел, там есть все ответы.
new int[3] - если писать так то мы показываем что хотим создать массив который будет хранить
какие то значения(int, String не важно). и мест для хранения этих значений всего 3,
мы можем положить только в первые 2 или последние, куда хотим и сколько хотим но не больше 3ех.
new int[3][] - eсли написать так то мы показываем что хотим создать массив который будет хранить не значения а массивы, то есть указывая скобки два раза [3][] означает что мы хотим хранить в массиве, другие массивы, и точка.
вот контейнер одномерного массива:
[ 1 ]
[ 2 ]
[ 3 ]
1,2,3 - это значения
а вот контейнер двумерного массива:
[ [ 1 ] ]
[ [ 2 ] ]
[ [ 3 ] ]
Итог:
[3][] - написав два раза скобки мы просто указываем что хотим в каждой ячейке массива хранить по массиву.
а какой размерности будут те массивы уже пофиг, и какие значения будут хранится в этих под массивах, тоже пофиг, ну на данном этапе,
а далее в коде мы уже указываем что сколько элементов и какие хотим хранить в этих под массивах.
в первой ячейке нашего массива(внешнего), инициализируем массив(внутренний) с элементами, и кол-во элементов будет как раз размерностью нашего массива.
array[0] = new int[]{1,2,3,4,5,6};
затем во второй ячейке нашего массива(внешнего), инициализируем массив(внутренний).
array[1] = new int[]{1,2,3};
и затем в третьей ячейке внешнего массива инициализируем массив(внутренний)
array[2] = new int[]{1,3,4,5,6,7,8}
внутренний - означает что внутри ячейки массива
то есть у нас не один внешний и один внутренний, а у нас один внешний с тремя ячейками(местами, сокетами, полками, называй как хочешь)) )
и в каждом хранится по массиву, если мы указали что у нас 3 ячейки значи 3 внутренних массива.
0
it
7 марта 2023, 09:26
длинна внутренних массивов эквивалентвно кол-ву значений, которые мы задаем дальше в коде...
0