将两个二维数组复制到另一个二维数组Java

7

我又有一个Java问题 :)

我阅读了这个帖子,其中清楚地解释了它,但我有两个二维数组需要复制。

我理解这段代码

int[] array1and2 = new int[array1.length + array2.length];
System.arraycopy(array1, 0, array1and2, 0, array1.length);
System.arraycopy(array2, 0, array1and2, array1.length, array2.length);

但我的问题是,我如何将其与两个数组合并?
int a1[][] = new int [3][3];
int b1[][] = new int [3][3];
int c1[][] = new int [3][6];
是上述数组的合并结果吗?

4
只需要使用for循环并在其中使用arraycopy。你试过了吗? - Mikita Belahlazau
想象一下你的数组的第二个维度是你想要合并的一维数组。因此,循环遍历第一个维度,并对已经找到的第二个维度执行相同的操作。 - timaschew
由于存在两个维度,不清楚它们应该如何合并。提供一个示例会更好。 - Bhesh Gurung
当涉及到想象维度等问题时,我感到很困难。但是你们说的有道理... - Marco Berrocal
@BheshGurung 我想把它们并排合并。我需要9个[3][3]维度的数组合并在一起,因为我将要开发数独游戏,但是我希望能够访问单独的数组以验证总和等。 - Marco Berrocal
1
我认为你只需要一个9X9的数组会更容易。在我看来,不应该玩弄那么多数组。即使你把它们分开,我也不觉得有必要合并它们。 - Bhesh Gurung
2个回答

3

使用您在问题中提到的任务的解决方案。例如:

import java.util.Arrays;

public class ArrayProgram {

    public static void main(String[] args) {
        int[][] array1 = { { 1, 2, 3 }, { 1, 2, 3 }, { 1, 2, 3 } };
        int[][] array2 = { { 4, 5, 6 }, { 7, 8, 9 }, { 0, 1, 2 } };
        int[][] result = ArrayCopier.joinSecondDimension(array1, array2);
        for (int[] array : result) {
            System.out.println(Arrays.toString(array));
        }
    }
}

class ArrayCopier {

    public static int[][] joinSecondDimension(int[][] array1, int[][] array2) {
        int[][] array1and2 = new int[array1.length][];
        for (int index = 0; index < array1.length; index++) {
            array1and2[index] = join(array1[index], array2[index]);
        }
        return array1and2;
    }

    public static int[] join(int[] array1, int[] array2) {
        int[] array1and2 = new int[array1.length + array2.length];
        System.arraycopy(array1, 0, array1and2, 0, array1.length);
        System.arraycopy(array2, 0, array1and2, array1.length, array2.length);
        return array1and2;
    }
}

输出:

[1, 2, 3, 4, 5, 6]
[1, 2, 3, 7, 8, 9]
[1, 2, 3, 0, 1, 2]

EDIT
实现任意数量参数的方法(可变长度参数列表):

import java.util.Arrays;

public class ArrayProgram {

    public static void main(String[] args) {
        int[][] array1 = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
        int[][] array2 = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
        int[][] array3 = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
        test(array1);
        test(array1, array2);
        test(array1, array2, array3);
    }

    private static void test(int[][]... arrays) {
        int[][] result = ArrayCopier.joinSecondDimension(arrays);
        for (int[] array : result) {
            System.out.println(Arrays.toString(array));
        }
        System.out.println();
    }
}

class ArrayCopier {

    public static int[][] joinSecondDimension(int[][]... arrays) {
        int firstArrayLength = arrays[0].length;
        int[][] result = new int[firstArrayLength][];
        for (int index = 0; index < firstArrayLength; index++) {
            result[index] = join(getSecondDimArrays(index, arrays));
        }
        return result;
    }

    public static int[] join(int[]... arrays) {
        int[] result = new int[getTotalLength(arrays)];
        int destPos = 0;
        for (int[] array : arrays) {
            System.arraycopy(array, 0, result, destPos, array.length);
            destPos += array.length;
        }
        return result;
    }

    private static int getTotalLength(int[]... arrays) {
        int length = 0;
        for (int[] array : arrays) {
            length += array.length;
        }
        return length;
    }

    private static int[][] getSecondDimArrays(int index, int[][]... arrays) {
        int[][] result = new int[arrays.length][];
        int resultIndex = 0;
        for (int[][] array : arrays) {
            result[resultIndex++] = array[index];
        }
        return result;
    }
}

输出:

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]

[1, 2, 3, 1, 2, 3]
[4, 5, 6, 4, 5, 6]
[7, 8, 9, 7, 8, 9]

[1, 2, 3, 1, 2, 3, 1, 2, 3]
[4, 5, 6, 4, 5, 6, 4, 5, 6]
[7, 8, 9, 7, 8, 9, 7, 8, 9]

这正是我所需要的...编辑:但是为什么要 TO string 呢?这行代码:System.out.println(Arrays.toString(array)); - Marco Berrocal
如果我没有使用“Arrays.toString”方法,那么应用程序可能会打印出这样的输出: [I@63e68a2b [I@3479404a [I@46bd530。文档:“返回指定数组内容的字符串表示形式。字符串表示形式由数组元素列表组成,括在方括号(“[]”)中...” 没有它,您只能看到对数组的引用。如果这个答案对您有帮助,请将其标记为“接受的答案”。 - Michał Ziober
谢谢。它也可以不需要那个。我会尝试找出打印9个3x3数组的方法。问题是我正在做数独游戏,需要将每个数组隔离开来,因为我必须检查每一个数组的总和,看它们是否匹配。 - Marco Berrocal
我很高兴能帮助您。如果您想将其打印为“数独”,则应考虑将这些数组提取到外部类(可能是Sudoku类)中,并且您应该覆盖toString方法。在toString方法中,您应该使用StringBuilder方法来创建数独棋盘的字符串表示形式。也许对于棋盘表示,您应该使用一个[9, 9]而不是多个[3, 3]数组。请考虑一下。 - Michał Ziober
但是我需要先洗牌值,在数独中,您需要解决数字为1-9的单个[3][3]网格。如何洗牌数组的值,使它们仅限于1-9的数字?在我看来,数独是一个巨大的[9][9]棋盘,有9个需要单独解决的[3][3]网格。 - Marco Berrocal
显示剩余3条评论

1

这样的东西应该完美地工作吧?

int a1[][] = new int [3][3];
int b1[][] = new int [3][3];
int c1[][] = new int [3][6];

for (int i = 0; i < a1.length; i++) {
    System.arraycopy(a1[i], 0, c1[i], 0, a1[i].length);
    System.arraycopy(a2[i], 0, c1[i], a1[i].length, a2[i].length);
}

顺便说一下,从您提供的尺寸来看,我认为c看起来像:

[  a, a, a,  ,  ,  ]
[  a, a, a,  , b,  ]
[  a, a, a,  ,  ,  ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接