Синтаксис для створення двовимірного масиву


438

Поміркуйте:

int[][] multD = new int[5][];
multD[0] = new int[10];

Це так, як ви створюєте двовимірний масив з 5 рядків та 10 стовпців?

Я бачив цей код в Інтернеті, але синтаксис не мав сенсу.


yea також міг би визначити двомірний масив як такий, що містить 10 стовпців у першому операторі. int [] [] multD = новий int [5] [10];
відданийандрейдер

Відповіді:


814

Спробуйте наступне:

int[][] multi = new int[5][10];

... що коротка рука для чогось подібного:

int[][] multi = new int[5][];
multi[0] = new int[10];
multi[1] = new int[10];
multi[2] = new int[10];
multi[3] = new int[10];
multi[4] = new int[10];

Зверніть увагу , що кожен елемент буде инициализирован значенням за замовчуванням для int, 0, тому наведені вище, також еквівалентні:

int[][] multi = new int[][]{
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};

27
Забавна частина полягає в тому, що ви також можете мати різні стовпці в різних рядках. Наприклад: - int [] [] multi = new int [5] []; multi [0] = new int [10]; multi [1] = new int [6]; multi [2] = new int [9] також ідеально діє
JavaTec

2
Привіт Muneeb, якщо я правильно зрозумів, ти задаєш багатовимірному масиву з різним розміром стовпця для кожного рядка, як призначити значення. Ось як: int [] [] multi = new int [] [] {{1,2,3}, {1,2,3,4}, {1}}; і ви можете отримувати доступ / друкувати їх так: for (int i = 0; i <multi.length; i ++) {for (int j = 0; j <multi [i] .length; j ++) {System.out.println ( "рядок:" + i + "стовпець:" + j + "значення:" + multi [i] [j]); }}
JavaTec

1
Чи потрібно використовувати new int[][]у =new int[][]{...}варіанті? Чи можемо ми просто написати ={...}?
Наваз

2
@Nawaz Ні, масиви є об'єктом у Java, а пам'ять виділяється Об'єктам лише за допомогою newключового слова.
roottraveller

1
@Oldrinb, що з int array[][] = new int[3][];VS int array[][] = new int[][3];?? яка з них легальна, оскільки я десь прочитав обидві версії.
roottraveller

77

Ми можемо оголосити двовимірний масив і безпосередньо зберігати елементи на момент його декларування як:

int marks[][]={{50,60,55,67,70},{62,65,70,70,81},{72,66,77,80,69}};

Тут int представляє елементи цілого числа, що зберігаються в масиві, а ім'я масиву - "знаки". int - тип даних для всіх елементів, представлених всередині брекетів "{" та "}, тому що масив - це сукупність елементів, що мають однаковий тип даних.

Повертаючись до нашого написаного вище твердження: кожен ряд елементів повинен бути записаний всередині фігурних дужок. Рядки та елементи в кожному ряду повинні бути розділені комами.

Тепер спостерігайте за твердженням: ви можете отримати там 3 рядки і 5 стовпців, тому JVM створює 3 * 5 = 15 блоків пам'яті. Ці блоки можна окремо називати:

marks[0][0]  marks[0][1]  marks[0][2]  marks[0][3]  marks[0][4]
marks[1][0]  marks[1][1]  marks[1][2]  marks[1][3]  marks[1][4]
marks[2][0]  marks[2][1]  marks[2][2]  marks[2][3]  marks[2][4]


ПРИМІТКА.
Якщо ви хочете зберегти n елементів, то індекс масиву починається з нуля і закінчується на n-1 . Інший спосіб створення двовимірного масиву - це спочатку оголосити масив, а потім виділити для нього пам'ять за допомогою нового оператора.

int marks[][];           // declare marks array
marks = new int[3][5];   // allocate memory for storing 15 elements

Комбінуючи вищевказані два, ми можемо написати:

int marks[][] = new int[3][5];

Я думаю, що це найзміцніший спосіб введення даних.
thanos.a

51

Ви можете створити їх так, як згадували інші. Ще один момент, який потрібно додати: Ви навіть можете створити перекошений двовимірний масив з кожним рядком, не обов'язково маючи однакову кількість стовпців, як це:

int array[][] = new int[3][];
array[0] = new int[3];
array[1] = new int[2];
array[2] = new int[5];

5
Добре сказано! Це найважливіший аспект незалежної ініціалізації.
Ганьба

@Victor, що з int array[][] = new int[3][];VS int array[][] = new int[][3];?? яка з них легальна, оскільки я десь прочитав обидві версії.
roottraveller

30

Найпоширеніша ідіома для створення двовимірного масиву з 5 рядків та 10 стовпців:

int[][] multD = new int[5][10];

Крім того, ви можете використовувати наступне, яке більше схоже на те, що у вас є, хоча потрібно чітко ініціалізувати кожен рядок:

int[][] multD = new int[5][];
for (int i = 0; i < 5; i++) {
  multD[i] = new int[10];
}

3
Також розумійте, що тільки примітиви не потребують ініціалізації. Якщо ви декларуєте масив таким, як Object[][] ary2d = new Object[5][10];і раніше, ви все одно повинні ініціалізувати кожен елемент 2D масиву.
Арман

3
Якщо ви не керуєте nullсправою безпечно для будь-яких не примітивів. Від того, чи слід ініціалізувати кожен елемент, чи ні, повністю залежить від вашого дизайну. Крім того, просто для уточнення - примітиви не можуть бути нульовими і отримати екземпляр до визначеного значення за замовчуванням, якщо воно не присвоєне вами. Наприклад, не intможе бути нульовим, і коли ви говорите, int i;не присвоюючи значення, використовується один із стандартних параметрів 0. Про це читайте тут
неподільний

Ще одне уточнення, значення за замовчуванням передаються лише змінним класу / екземпляра. Локальні змінні (внутрішні методи) перед використанням повинні бути ініціалізовані вручну.
неподільний

12

Це також можна заявити наступним чином. Це не гарний дизайн, але він працює.

int[] twoDimIntArray[] = new int[5][10];

9

Спробуйте:

int[][] multD = new int[5][10];

Зауважте, що у вашому коді лише перший рядок 2D масиву ініціалізований до 0. Рядок 2 - 5 навіть не існує. Якщо ви спробуєте роздрукувати їх, ви отримаєте nullдля кожного з них.


8
int [][] twoDim = new int [5][5];

int a = (twoDim.length);//5
int b = (twoDim[0].length);//5

for(int i = 0; i < a; i++){ // 1 2 3 4 5
    for(int j = 0; j <b; j++) { // 1 2 3 4 5
        int x = (i+1)*(j+1);
        twoDim[i][j] = x;
        if (x<10) {
            System.out.print(" " + x + " ");
        } else {
            System.out.print(x + " ");
        }
    }//end of for J
    System.out.println();
}//end of for i

8

У Java двовимірний масив можна оголосити таким же, як і одновимірний масив. В одновимірний масив можна писати як

  int array[] = new int[5];

де int - тип даних, масив [] є оголошенням масиву і new arrayє масивом з його об'єктами з п'ятьма індексами.

Так, ви можете записати двовимірний масив наступним чином.

  int array[][];
  array = new int[3][4];

Ось arrayтип даних int. Я спочатку оголосив на одновимірному масиві цих типів, потім створюється масив з 3 рядками та 4 стовпцями.

У своєму коді

int[][] multD = new int[5][];
multD[0] = new int[10];

означає, що ви створили двовимірний масив з п'ятьма рядками. У першому ряду - 10 стовпців. На Java ви можете вибрати розмір стовпця для кожного рядка за вашим бажанням.


7
int rows = 5;
int cols = 10;

int[] multD = new int[rows * cols];

for (int r = 0; r < rows; r++)
{
  for (int c = 0; c < cols; c++)
  {
     int index = r * cols + c;
     multD[index] = index * 2;
  }
}

Насолоджуйтесь!


1
Це було б корисно мовою, яка не підтримує 2D-масиви на зразок C!
Алаа

3
C також підтримує багатовимірні масиви.
Рікардо Крус


3

Ці типи масивів на Java відомі як нерівні масиви:

int[][] multD = new int[3][];
multD[0] = new int[3];
multD[1] = new int[2];
multD[2] = new int[5];

У цьому сценарії кожен рядок масиву містить різну кількість стовпців. У наведеному вище прикладі перший рядок буде містити три стовпці, другий ряд буде містити два стовпці, а третій ряд містить п'ять стовпців. Ви можете ініціалізувати цей масив у час компіляції, як нижче:

 int[][] multD = {{2, 4, 1}, {6, 8}, {7, 3, 6, 5, 1}};

Ви можете легко повторити всі елементи у своєму масиві:

for (int i = 0; i<multD.length; i++) {
    for (int j = 0; j<multD[i].length; j++) {
        System.out.print(multD[i][j] + "\t");
    }
    System.out.println();
}

0

Насправді Java не має багатовимірного масиву в математичному сенсі. Java має лише масив масивів, масив, де кожен елемент також є масивом. Ось чому абсолютна вимога його ініціалізації - це розмір першого виміру. Якщо решта вказана, то вона створить масив, заповнений значенням за замовчуванням.

int[][]   ar  = new int[2][];
int[][][] ar  = new int[2][][];
int[][]   ar  = new int[2][2]; // 2x2 array with zeros

Це також дає нам химерність. Розмір підмасиву не можна змінити, додавши більше елементів, але ми можемо це зробити, призначивши новий масив довільного розміру.

int[][]   ar  = new int[2][2];
ar[1][3] = 10; // index out of bound
ar[1]    = new int[] {1,2,3,4,5,6}; // works
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.