【问题标题】:What is the best way to concatenate multi-dimensional arrays in java?在java中连接多维数组的最佳方法是什么?
【发布时间】:2016-11-07 21:06:54
【问题描述】:

我有 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 组合的一个糟糕的可视化。
|--| + |--| + |--| + |--| = |--|--|
|--| |--| |--| |--| |--|--|
. |--|--|

【问题讨论】:

  • 如果 A 和 B 是两个 2x2 暗矩阵,其中 A 是 [1 2] _ [3 4] 而 B 是 [5 6] _ [7 8] (使用这一行符号 A( 1,1) 是 1 并且 A(2,1) 是 3) 使用上述循环的输出将是 [1 2 0 0] _ [3 4 0 0] _ [5 6 0 0] _ [7 8 0 0 ]。这是你想要的输出吗?
  • 为什么要做二维数组的4维数组?
  • 你的数组总是 int 类型吗?在所有维度上总是相同的大小(2 x 2 或 3 x 3,从不 2 x 3)?你想用你的 3 维和 4 维数组做什么?
  • @hanif 我把代码剪短了,因为它是重复的。只需结合 2,是的,这就是我想要的结果。但是,我将组合 4 个,而不是 2 个。我不想从 4 个 2D 中制作 4D。我想从 4 个二维数组中创建一个二维。
  • 虽然这个问题作为“编程挑战/谜题”很有趣,但对于实际问题来说,这听起来像是一种可怕的方法。我的意思是,你的程序中真的有int[][][][] 数组吗?您想将其中的 2^4=16 (!) 个组合成一个大数组吗?按什么顺序? (字典式还是合式式?)无论您在那里做什么,我都会强烈建议以不同的方式解决它。为您的“n 维 int-Array”创建一个接口(并且可能已经有相应的库)。

标签: java arrays multidimensional-array append concatenation


【解决方案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 维做类似的事情。

【讨论】:

    猜你喜欢
    • 2015-02-26
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多