我有2维,3维和4维数组。 (所有在不同的时间)
如果我想连接4个2D阵列(4个2x2到1个4x4),我可以用简单的循环来做到这一点
int[][] result = new int[2 * array1.length][2 * array1.length];
for(int x = 0; x < array1.length; x++)
for(int y = 0; y < array1.length; y++)
result[x][y] = array1[x][y];
for(int x = array1.length; x < result.length; x++)
for(int y = 0; y < array1.length; y++)
result[x][y] = array2[x - array1.length][y];
...
正如您所看到的,这变得非常混乱(2 ^ n组循环,其中n是维数)。我知道我可以使用System.arraycopy简化这个,但我仍然需要尽可能多的循环集
我有更简单的方法吗?最好是适用于所有尺寸阵列的一种吗?
请注意,我正在添加到每个维度,而不仅仅是添加一个到另一个维度的末尾。
为了可视化我正在做的事情,将每个2D阵列想象成一个正方形,将每个3D阵列想象成一个立方体。要将它们组合在一起,将它们拼接在一起形成一个2x2的正方形(每个单元是一个2D阵列)或一个2x2x2的立方体(每个单元是一个3D阵列)。
这是2D组合的可视化效果不佳
|--| + |--| + |--| + |--| = |--|--|
|--| |--| |--| |--| |--|--|
. |--|--|
答案 0 :(得分:1)
对于二维数组,您可以声明:
private static void fillInto(int[][] biggerArray, int[][] smallArray, int targetI, int targetJ) {
int expectedLength = smallArray.length;
for (int i = 0; i < smallArray.length; i++) {
if (smallArray[i].length != expectedLength) {
throw new IllegalArgumentException("Unexpected length " + smallArray[i].length);
}
System.arraycopy(smallArray[i], 0, biggerArray[targetI + i], targetJ, expectedLength);
}
}
现在你可以去:
int[][] array1 = new int[][] { { 1, 2 }, { 3, 2 } };
int[][] array2 = new int[][] { { 3, 4 }, { 6, 4 } };
int[][] array3 = new int[][] { { 5, 5 }, { 10, 6 } };
int[][] array4 = new int[][] { { 7, 6 }, { 13, 8 } };
int[][] result = new int[2 * array1.length][2 * array1.length];
fillInto(result, array1, 0, 0);
fillInto(result, array2, array1.length, 0);
fillInto(result, array3, 0, array1.length);
fillInto(result, array4, array1.length, array1.length);
System.out.println(Arrays.deepToString(result));
结果:
[[1, 2, 5, 5], [3, 2, 10, 6], [3, 4, 7, 6], [6, 4, 13, 8]]
您可以为3维和4维执行类似的操作。