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á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:
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 y
và 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ố x
và y
nằ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.
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, arr
chỉ đơ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]]]"
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.
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"}};
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à:
int[ ] num[ ] = {{1,2}, {1,2}, {1,2}, {1,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
;
Dưới đây, num1.length
cung cấp cho bạn các hàng.
Trong khi num1[0].length
cung 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]
và num[0][1]
duy nhất.
Ở đây chúng tôi đã sử dụng một for
vòng lặp giúp chúng tôi tính toán num1[i].length
. Đây i
là 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]);
}
}
}
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
.
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
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}
}
};