Як створюється 2D-масив, як запам'ятати, чи спочатку вказані рядки чи стовпці?
Відповіді:
Java вважається "основним рядком", це означає, що він робить рядки першими. Це пов’язано з тим, що 2D-масив є «масивом масивів».
Наприклад:
int[ ][ ] a = new int[2][4]; // Two rows and four columns.
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0] a[1][1] a[1][2] a[1][3]
Його також можна візуалізувати більш таким чином:
a[0] -> [0] [1] [2] [3]
a[1] -> [0] [1] [2] [3]
Друга ілюстрація демонструє аспект "масив масивів". Перший масив містить {a[0] and a[1]}
, і кожен з них являє собою масив , що містить чотири елементи, {[0][1][2][3]}
.
TL; Анотація DR:
Array[number of arrays][how many elements in each of those arrays]
Для отримання додаткових пояснень див. Також Масиви - 2-мірні .
Незважаючи на те, що Matt B's може бути правдою в одному сенсі, це може допомогти думати про багатовимірний масив Java, не думаючи про геометричні матриці взагалі. Яскраві масиви Java - це просто масиви масивів, і кожен елемент першого "виміру" може мати різний розмір від інших елементів, або фактично може зберігати нульовий "під" масив. Див. Коментарі до цього питання
Інстинктивно мислиться геометрично: горизонтальна (X) вісь, а потім вертикальна (Y) вісь. Однак це не стосується двовимірного масиву, спочатку рядки, а потім стовпці.
Розглянемо таку аналогію: в геометрії підходить до сходів (вісь X) і піднімається по ній (вісь Y). І навпаки, в Java людина спускається по сходах (ряди) і відходить (стовпці).
To be crystal clear, it is not merely OK to ask and answer your own question, it is explicitly encouraged.
Все залежить від вашої візуалізації масиву. Рядки та стовпці - це властивості візуалізації (можливо, у вашій уяві) масиву, а не самого масиву.
Це точно те саме, що запитати число "5" червоне чи зелене?
Я міг намалювати його червоним, я міг намалювати це жадібність, так? Колір не є невід'ємною властивістю числа. Таким же чином представлення 2D-масиву як сітки рядків і стовпців не є необхідним для існування цього масиву.
2D-масив має лише перший і другий розміри , все, що стосується їх візуалізації, - це виключно ваш смак.
Коли у мене є масив char char[80][25]
, я можу хотіти надрукувати його на повороті консолі, щоб у мене було 25 рядків із 80 символів, які відповідають екрану без прокрутки.
Я спробую навести життєздатний приклад, коли представляти 2D-масив як рядки та стовпці взагалі не має сенсу : Скажімо, мені потрібен масив з 1 000 000 000 цілих чисел. На моїй машині є 8 ГБ оперативної пам’яті, тому у мене для цього достатньо пам’яті, але якщо ви спробуєте виконати var a = new int[1000000000]
, швидше за все, ви отримаєте виняток OutOfMemory. Це через фрагментацію пам’яті - послідовного блоку пам’яті такого розміру не існує. Натомість ви можете створити 2D-масив 10 000 x 100 000 зі своїми значеннями. Логічно, що це 1D масив, тому ви хотіли б намалювати і уявити його як єдину послідовність значень, але завдяки технічній реалізації це 2D.
У Java немає багатовимірних масивів. Є масиви масивів. Так:
int[][] array = new int[2][3];
Насправді він складається з двох масивів, кожен з яких має три елементи.
Найкращий спосіб запам'ятати, якщо рядки чи стовпці стоять першими, - це написати коментар та згадати його.
Java не зберігає 2D-масив як таблицю із зазначеними рядками та стовпцями, він зберігає його як масив масивів, як пояснюється у багатьох інших відповідях. Тож ви можете вирішити, перший чи другий вимір - це ваш рядок. Вам просто потрібно прочитати масив залежно від цього.
Отож, оскільки мене це постійно бентежить, я завжди пишу коментар, який говорить мені, який розмір 2-го масиву є моїм рядком, а який - моїм стовпцем.
У Java рядки виконуються спочатку, оскільки двовимірний масив вважається двома окремими масивами. Починається з першого рядка 1 розмірний масив.
У c ++ (віддалена, запилена пам'ять) я думаю, було трохи легше дивитись на код і розуміти масиви, ніж це іноді на Java. Обидва вони є основними. Ця ілюстрація допомогла мені зрозуміти.
Враховуючи цей код для 2d масиву рядків ...
String[][] messages;
messages = new String[][] {
{"CAT","DOG","YIN","BLACK","HIGH","DAY"},
{"kitten","puppy","yang","white","low","night"}
};
int row = messages.length;
int col = messages[0].length;
Іменуючи мої ints так, ніби це 2d-масив (рядок, col), ми бачимо значення.
row = (int) 2
col = (int) 6
Останні два рядки коду, де ми намагаємось визначити розмір і встановити для них row
і col
не виглядає все так інтуїтивно і це не обов'язково правильно.
Тут ви справді маєте справу з цим (зверніть увагу на нові назви змінних для ілюстрації):
int numOfArraysIn = messages.length;
int numOfElementsIn0 = messages[0].length;
int numOfElementsIn1 = messages[1].length;
Де messages.length
тобі підказуєmessages
є два масиви. Масив масивів.
І тоді messages[x].length
отримує розмір кожного з окремих масивів 0
1
усередині messages
.
numOfArraysIn = (int) 2
numOfElementsIn0 = (int) 6
numOfElementsIn1 = (int) 6
Коли ми друкуємо з для кожного циклу ....
for (String str : messages[0])
System.out.print(str);
for (String str : messages[1])
System.out.print(str);
CATDOGYINBLACKHIGHDAYkittenpuppyyangwhitelownight
Спроба скинути дужки та друкувати таким чином видає помилку
for (String str : messages)
System.out.print(str);
incompatible types: String[] cannot be converted to String
Вищесказане важливо розуміти під час налаштування циклів, які використовують .length
для обмеження кроку через масив.