Maz*_*ino 3 java arrays multidimensional-array
有没有可能创建具有可变维数的数组?
例如,
int x = 3;
// becomes
int[][][] array = new int[3][3][3];
//and
int y = 4;
//becomes
int[][][][] xray = new int[4][4][4][4];
Run Code Online (Sandbox Code Playgroud)
我的例子如此间接的部分原因是因为我不知道人们会如何做这样的事情。
如果我有一个变量,我想创建一个与该变量具有相同维数的数组
你不能直接这样做,但你可以用一维数组来模拟它。
假设您有一个 3 行 4 列的二维数组。您可以将其实现为一个包含 12 个元素的数组,并编写一个get例程来获取该A[i,j]元素,如下所示:
int[] A = new int[12];
int get(int i, int j) {
return A[4 * i + j];
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以编写一个set方法以相同的方式设置数组的元素。
转到维度为 3x4x5 的 3 维数组,您可以执行类似的操作:
int[] A = new int[60];
int get(int i, int j, int k) {
return A[4*5*i + 5*j + k];
}
Run Code Online (Sandbox Code Playgroud)
或 4 维 3x4x5x6 数组:
int[] A = new int[360];
int get(int i, int j, int k, int m) {
return A[4*5*6*i + 5*6*j + 6*k + m];
}
Run Code Online (Sandbox Code Playgroud)
依此类推...您应该能够看到该模式。
一旦掌握了这一点,为具有可变维数的数组编写一个类就不难了。和方法可以采用可变数量索引的参数,构造函数也可以类似地采用 anget来指定维度。该类将有一个私有的一维数组,其长度是所有维度的乘积。和方法应该检查每个索引以确保它 >= 0 且小于相应的维度,否则抛出异常。setint...int...getset
这就是大多数支持多维数组的语言在底层实现“真正的”多维数组的方式(Java 不是其中之一;它只有一维数组,其元素可以引用其他一维数组)。这称为“行主序”。有关更多信息(包括通用公式),请参阅https://en.wikipedia.org/wiki/Row-_and_column-major_order 。