Składnia do tworzenia dwuwymiarowej tablicy

438

Rozważać:

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

Czy w ten sposób tworzysz dwuwymiarową tablicę z 5 rzędami i 10 kolumnami?

Widziałem ten kod online, ale składnia nie miała sensu.

AppSensei
źródło
tak, można również zdefiniować tablicę dwuwymiarową jako zawierającą 10 kolumn w pierwszej instrukcji. int [] [] multD = new int [5] [10];
zaangażowanieandroider

Odpowiedzi:

814

Spróbuj wykonać następujące czynności:

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

... co jest skrótem od czegoś takiego:

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];

Należy pamiętać, że każdy element zostanie zainicjowany na wartość domyślną dla int, 0, więc powyższe są również równoważne:

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 }
};
oldrinb
źródło
27
Zabawne jest to, że możesz mieć także różne kolumny w różnych rzędach. Na przykład: - int [] [] multi = new int [5] []; multi [0] = nowy int [10]; multi [1] = new int [6]; multi [2] = new int [9] jest również doskonale poprawny
JavaTec
2
Cześć Muneeb, jeśli dobrze zrozumiałem, pytasz w tablicy wielowymiarowej, z innym rozmiarem kolumny dla każdego wiersza, jak przypisać wartości. Oto jak: int [] [] multi = new int [] [] {{1,2,3}, {1,2,3,4}, {1}}; i możesz uzyskać do nich dostęp / wydrukować je w następujący sposób: for (int i = 0; i <multi.length; i ++) {for (int j = 0; j <multi [i] .length; j ++) {System.out.println ( „wiersz:” + i + ”kolumna:„ + j + ”wartość:„ + multi [i] [j]); }}
JavaTec
1
Czy musimy używać new int[][]w =new int[][]{...}wariancie? Czy możemy po prostu pisać ={...}?
Nawaz
2
@Nawaz Nie, tablice są obiektami w Javie, a pamięć jest przydzielana do obiektów tylko przy użyciu newsłowa kluczowego.
roottraveller
1
@Oldrinb co z int array[][] = new int[3][];VS int array[][] = new int[][3];? który jest legalny, ponieważ gdzieś przeczytałem obie wersje.
roottraveller
77

Możemy zadeklarować tablicę dwuwymiarową i bezpośrednio przechowywać elementy w momencie jej deklaracji jako:

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

Tutaj int reprezentuje elementy typu liczb całkowitych przechowywane w tablicy, a nazwa tablicy to „znaczniki”. int jest typem danych dla wszystkich elementów reprezentowanych w nawiasach klamrowych „{” i „}”, ponieważ tablica jest zbiorem elementów o tym samym typie danych.

Wracając do naszego powyższego stwierdzenia: każdy rząd elementów powinien być zapisany w nawiasach klamrowych. Wiersze i elementy w każdym rzędzie powinny być oddzielone przecinkami.

Teraz obserwuj stwierdzenie: możesz uzyskać 3 wiersze i 5 kolumn, więc JVM tworzy 3 * 5 = 15 bloków pamięci. Bloki te można indywidualnie nazywać ta:

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]


UWAGA:
Jeśli chcesz zapisać n elementów, indeks tablicy zaczyna się od zera i kończy na n-1 . Innym sposobem utworzenia dwuwymiarowej tablicy jest najpierw zadeklarowanie tablicy, a następnie przydzielenie jej pamięci za pomocą nowego operatora.

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

Łącząc powyższe dwa, możemy napisać:

int marks[][] = new int[3][5];
Indu Joshi
źródło
Myślę, że jest to najbardziej sumienny sposób wprowadzania danych.
thanos.a
51

Możesz je tworzyć tak, jak wspominali inni. Jeszcze jeden punkt do dodania: możesz nawet utworzyć przekrzywioną dwuwymiarową tablicę dla każdego wiersza, niekoniecznie mając taką samą liczbę kolumn, jak poniżej:

int array[][] = new int[3][];
array[0] = new int[3];
array[1] = new int[2];
array[2] = new int[5];
Victor Mukherjee
źródło
5
Dobrze powiedziane! Jest to najważniejszy aspekt niezależnej inicjalizacji.
Ahamed,
@Victor co z int array[][] = new int[3][];VS int array[][] = new int[][3];? który jest legalny, ponieważ gdzieś przeczytałem obie wersje.
roottraveller
30

Najczęstszym idiomem do tworzenia dwuwymiarowej tablicy z 5 wierszami i 10 kolumnami jest:

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

Alternatywnie możesz użyć następujących, które są bardziej podobne do tego, co masz, chociaż musisz jawnie zainicjować każdy wiersz:

int[][] multD = new int[5][];
for (int i = 0; i < 5; i++) {
  multD[i] = new int[10];
}
João Silva
źródło
3
Należy również pamiętać, że tylko operacje podstawowe nie wymagają inicjalizacji. Jeśli zadeklarujesz tablicę w ten sposób Object[][] ary2d = new Object[5][10];, nadal musisz zainicjować każdy element tablicy 2D.
Armand
3
Chyba że nullbezpiecznie obchodzisz się ze skrzynką w przypadku jakichkolwiek prymitywów. To, czy powinieneś zainicjować każdy element, zależy całkowicie od twojego projektu. Ponadto, aby wyjaśnić - prymitywy nie mogą mieć wartości zerowej i zostaną utworzone do określonej wartości domyślnej, jeśli nie zostanie ona przez ciebie przypisana. Np. An intnie może być zerowy, a gdy mówisz int i;bez przypisania wartości, 0używana jest domyślna z . Przeczytaj o tym tutaj
niepodzielny
Jeszcze jedno wyjaśnienie: wartości domyślne są przekazywane tylko zmiennym klasy / instancji. Zmienne lokalne (metody wewnętrzne) należy ręcznie zainicjować przed użyciem.
niepodzielny
12

Można to również zadeklarować w następujący sposób. To nie jest dobry projekt, ale działa.

int[] twoDimIntArray[] = new int[5][10];
Ctomek
źródło
9

Próbować:

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

Zauważ, że w twoim kodzie tylko pierwsza linia tablicy 2D jest inicjowana na 0. Linia 2 do 5 nawet nie istnieje. Jeśli spróbujesz je wydrukować, dostaniesz nullza każdego z nich.

dcernahoschi
źródło
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
Kieran Horton
źródło
8

W Javie tablica dwuwymiarowa może być zadeklarowana jako taka sama jak tablica jednowymiarowa. W jednowymiarowej tablicy możesz pisać jak

  int array[] = new int[5];

gdzie int jest typem danych, tablica [] jest deklaracją tablicową i new arrayjest tablicą z obiektami o pięciu indeksach.

W ten sposób możesz napisać tablicę dwuwymiarową w następujący sposób.

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

Oto arraytyp danych int. Najpierw zadeklarowałem tablicę jednowymiarową tego typu, a następnie tworzona jest tablica z 3 wierszami i 4 kolumnami.

W twoim kodzie

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

oznacza, że ​​utworzyłeś dwuwymiarową tablicę z pięcioma rzędami. W pierwszym rzędzie znajduje się 10 kolumn. W Javie możesz wybrać rozmiar kolumny dla każdego wiersza, jak chcesz.

Zishan
źródło
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;
  }
}

Cieszyć się!

Albeoris
źródło
1
Byłoby to przydatne w języku, który nie obsługuje tablic 2D, takich jak C!
Alaa
3
C obsługuje również tablice wielowymiarowe.
Ricardo Cruz
4

Wypróbuj w ten sposób:

int a[][] = {{1,2}, {3,4}};

int b[] = {1, 2, 3, 4};
Piyush Bulchandani
źródło
3

Te typy tablic w Javie są nazywane tablicami postrzępionymi:

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

W tym scenariuszu każdy wiersz tablicy zawiera inną liczbę kolumn. W powyższym przykładzie pierwszy rząd pomieści trzy kolumny, drugi rząd pomieści dwie kolumny, a trzeci rząd pięć kolumn. Możesz zainicjalizować tę tablicę w czasie kompilacji, jak poniżej:

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

Możesz łatwo iterować wszystkie elementy w tablicy:

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();
}
ritesh9984
źródło
0

W rzeczywistości Java nie ma macierzy wielowymiarowej w sensie matematycznym. Java ma tylko tablicę tablic, tablicę, w której każdy element jest również tablicą. Dlatego bezwzględnym wymogiem do jego zainicjowania jest rozmiar pierwszego wymiaru. Jeśli reszta zostanie określona, ​​utworzy tablicę wypełnioną wartością domyślną.

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

Daje nam to także dziwactwo. Rozmiar pod-tablicy nie może być zmieniony poprzez dodanie większej liczby elementów, ale możemy to zrobić, przypisując nową tablicę o dowolnym rozmiarze.

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
mit
źródło