在java中连接多维数组的最佳方法是什么?

时间:2016-07-05 21:53:05

标签: java arrays multidimensional-array append concatenation

我有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组合的可视化效果不佳 |--| + |--| + |--| + |--| = |--|--|
|--| |--| |--| |--| |--|--|
. |--|--|

1 个答案:

答案 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维执行类似的操作。