Khởi tạo mảng đa chiều trong Java


81

Cách chính xác để khai báo một mảng nhiều chiều và gán giá trị cho nó là gì?

Đây là những gì tôi có:

int x = 5;
int y = 5;

String[][] myStringArray = new String [x][y];

myStringArray[0][x] = "a string";
myStringArray[0][y] = "another string";

Câu trả lời:


64

Hãy thử thay thế các dòng thích hợp bằng:

myStringArray[0][x-1] = "a string";
myStringArray[0][y-1] = "another string";

Mã của bạn không chính xác vì các mảng con có độ dài bằng yvà việc lập chỉ mục bắt đầu bằng 0. Vì vậy, việc đặt thành myStringArray[0][y]hoặc myStringArray[0][x]sẽ không thành công vì các chỉ số xynằm ngoài giới hạn.

String[][] myStringArray = new String [x][y];là cách chính xác để khởi tạo một mảng đa chiều hình chữ nhật. Nếu bạn muốn nó có hình răng cưa (mỗi mảng con có thể có độ dài khác nhau) thì bạn có thể sử dụng mã tương tự như câu trả lời này . Tuy nhiên, lưu ý rằng khẳng định của John rằng bạn phải tạo các mảng con theo cách thủ công là không chính xác trong trường hợp bạn muốn một mảng đa chiều hình chữ nhật hoàn hảo.


105

Java không có mảng đa chiều "đúng".

Ví dụ, arr[i][j][k]là tương đương với ((arr[i])[j])[k]. Nói cách khác, arrchỉ đơn giản là một mảng, mảng, mảng .

Vì vậy, nếu bạn biết cách hoạt động của mảng, bạn sẽ biết cách hoạt động của mảng nhiều chiều!


Tờ khai:

int[][][] threeDimArr = new int[4][5][6];

hoặc, với khởi tạo:

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

Truy cập:

int x = threeDimArr[1][0][1];

hoặc là

int[][] row = threeDimArr[1];

Biểu diễn chuỗi:

Arrays.deepToString(threeDimArr);

hoa lợi

"[[[1, 2], [3, 4]], [[5, 6], [7, 8]]]"

Bài viết hữu ích


3
Làm thế nào đó không phải là một mảng đa chiều "đúng"?
dhardy

13
Với mảng nhiều chiều "đúng" tôi đề cập đến mảng "không răng cưa". Để biết sự khác biệt giữa mảng răng cưa và mảng nhiều chiều "đúng", hãy xem câu hỏi này .
aioobe

2
An int[i][j][k]có độ dài i, vì vậy thực sự nó tương đương với một ((int[k])[j])[i]. Các kích thước trong khai báo được viết ngược lại so với các kiểu, tôi cho rằng để làm cho mảng nhiều chiều gần giống với ma trận trong toán học hơn.
Milosz 9/1017

Cảm ơn bạn đã đề cập đến Arrays.deepToString.
samir105

60

Bạn cũng có thể sử dụng cấu trúc sau:

String[][] myStringArray = new String [][] { { "X0", "Y0"},
                                             { "X1", "Y1"},
                                             { "X2", "Y2"},
                                             { "X3", "Y3"},
                                             { "X4", "Y4"} };

13

Bạn có thể khai báo mảng nhiều chiều như:

// 4 x 5 String arrays, all Strings are null
// [0] -> [null,null,null,null,null]
// [1] -> [null,null,null,null,null]
// [2] -> [null,null,null,null,null]
// [3] -> [null,null,null,null,null]

String[][] sa1 = new String[4][5];
for(int i = 0; i < sa1.length; i++) {           // sa1.length == 4
    for (int j = 0; j < sa1[i].length; j++) {     //sa1[i].length == 5
        sa1[i][j] = "new String value";
    }
}


// 5 x 0  All String arrays are null
// [null]
// [null]
// [null]
// [null]
// [null]
String[][] sa2 = new String[5][];
for(int i = 0; i < sa2.length; i++) {
    String[] anon = new String[ /* your number here */];
    // or String[] anon = new String[]{"I'm", "a", "new", "array"};
    sa2[i] = anon;
}

// [0] -> ["I'm","in","the", "0th", "array"]
// [1] -> ["I'm", "in", "another"]
String[][] sa3 = new String[][]{ {"I'm","in","the", "0th", "array"},{"I'm", "in", "another"}};

9

Mảng đa chiều trong Java

Trả về một mảng đa chiều

Java không thực sự hỗ trợ mảng đa chiều. Trong Java, mảng hai chiều chỉ đơn giản là một mảng các mảng, mảng ba chiều là một mảng các mảng, mảng bốn chiều là một mảng các mảng của mảng, v.v.

Chúng ta có thể định nghĩa một mảng hai chiều là:

  1. int[ ] num[ ] = {{1,2}, {1,2}, {1,2}, {1,2}}

  2. int[ ][ ] num = new int[4][2]

    num[0][0] = 1;
    num[0][1] = 2;
    num[1][0] = 1;
    num[1][1] = 2;
    num[2][0] = 1;
    num[2][1] = 2;
    num[3][0] = 1;
    num[3][1] = 2;
    

    Nếu bạn không cấp phát, giả sử num[2][1], nó không được khởi tạo và sau đó nó tự động được cấp phát 0, tức là tự động num[2][1] = 0;

  3. Dưới đây, num1.lengthcung cấp cho bạn các hàng.

  4. Trong khi num1[0].lengthcung cấp cho bạn số lượng phần tử liên quan đến num1[0]. Ở đây num1[0]có các mảng liên quan num1[0][0]num[0][1]duy nhất.

  5. Ở đây chúng tôi đã sử dụng một forvòng lặp giúp chúng tôi tính toán num1[i].length. Đây ilà tăng dần qua một vòng lặp.

    class array
    {
        static int[][] add(int[][] num1,int[][] num2)
        {
            int[][] temp = new int[num1.length][num1[0].length];
            for(int i = 0; i<temp.length; i++)
            {
                for(int j = 0; j<temp[i].length; j++)
                {
                    temp[i][j] = num1[i][j]+num2[i][j];
                }
            }
            return temp;
        }
    
        public static void main(String args[])
        {
            /* We can define a two-dimensional array as
                 1.  int[] num[] = {{1,2},{1,2},{1,2},{1,2}}
                 2.  int[][] num = new int[4][2]
                     num[0][0] = 1;
                     num[0][1] = 2;
                     num[1][0] = 1;
                     num[1][1] = 2;
                     num[2][0] = 1;
                     num[2][1] = 2;
                     num[3][0] = 1;
                     num[3][1] = 2;
    
                     If you don't allocate let's say num[2][1] is
                     not initialized, and then it is automatically
                     allocated 0, that is, automatically num[2][1] = 0;
                  3. Below num1.length gives you rows
                  4. While num1[0].length gives you number of elements
                     related to num1[0]. Here num1[0] has related arrays
                     num1[0][0] and num[0][1] only.
                  5. Here we used a 'for' loop which helps us to calculate
                     num1[i].length, and here i is incremented through a loop.
            */
            int num1[][] = {{1,2},{1,2},{1,2},{1,2}};
            int num2[][] = {{1,2},{1,2},{1,2},{1,2}};
    
            int num3[][] = add(num1,num2);
            for(int i = 0; i<num1.length; i++)
            {
                for(int j = 0; j<num1[j].length; j++)
                    System.out.println("num3[" + i + "][" + j + "]=" + num3[i][j]);
            }
        }
    }
    

4

Tôi sẽ nói thêm rằng nếu bạn muốn đọc các thứ nguyên, bạn có thể làm như sau:

int[][][] a = new int[4][3][2];

System.out.println(a.length);  // 4
System.out.println(a[0].length); // 3
System.out.println(a[0][0].length); //2

Bạn cũng có thể có các mảng răng cưa , trong đó các hàng khác nhau có độ dài khác nhau, vì vậy a[0].length != a[1].length.


1
 int[][] myNums = { {1, 2, 3, 4, 5, 6, 7}, {5, 6, 7, 8, 9, 10, 11} };
 for (int x = 0; x < myNums.length; ++x) {
    for(int y = 0; y < myNums[i].length; ++y) {
       System.out.print(myNums[x][y]);
    }
 }

Đầu ra

1 2 3 4 5 6 7 5 6 7 8 9 10 11


-3

Bạn có thể nhìn vào điều này để bắt đầu:

    int [][][] i = {                //third dimension curly brace
                     {               // second dimension curly brace
                        {            //first dimension curly brace
                           1,1,1    //elements
                        },           
                    {3,3,3},    
                    {2,2,2}     
                      },
                      {
                         {
                          1,1,1
                         },
                         {3,3,3},
                         {2,2,2}
                       }
                    };      

2
Đây là câu trả lời hay là gì?
maytham-ɯɐɥʇʎɐɯ

7
Sau đó, tôi hy vọng anh ấy đói để ăn nó
maytham-ɯɐɥʇʎɐɯ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.