你如何正确地在java中附加两个2D数组?

我一直在尝试在java中附加两个2 D数组。 是否有可能得到一个例子,因为我一直试图查找它但找不到一个。

int [][]appendArray(empty,window) { int [][]result= new int [empty.length][empty[0].length+window[0].length]; } 

干得好:

 import java.util.Arrays; public class Array2DAppend { public static void main(String[] args) { int[][] a = new int[][] {{1, 2}, {3, 4}}; int[][] b = new int[][] {{1, 2, 3}, {3, 4, 5}}; System.out.println(Arrays.deepToString(a)); System.out.println(Arrays.deepToString(b)); System.out.println(Arrays.deepToString(append(a, b))); } public static int[][] append(int[][] a, int[][] b) { int[][] result = new int[a.length + b.length][]; System.arraycopy(a, 0, result, 0, a.length); System.arraycopy(b, 0, result, a.length, b.length); return result; } } 

和输出:

 [[1, 2], [3, 4]] [[1, 2, 3], [3, 4, 5]] [[1, 2], [3, 4], [1, 2, 3], [3, 4, 5]] 

如果我已正确理解你的问题,这个方法会将两个2d数组附加在一起 ​​-

 private static int[][] appendArrays(int[][] array1, int[][] array2) { int[][] ret = new int[array1.length + array2.length][]; int i = 0; for (;i 

这个快速的代码将测试它 -

  int[][] array1 = new int[][] { {1, 2, 3}, {3, 4, 5, 6}, }; int[][] array2 = new int[][] { {11, 12, 13}, {13, 14, 15, 16}, }; int[][] expected = new int[][] { {1, 2, 3}, {3, 4, 5, 6}, {11, 12, 13}, {13, 14, 15, 16}, }; int[][] appended = appendArrays(array1, array2); System.out.println("This"); for (int i = 0; i < appended.length; i++) { for (int j = 0; j < appended[i].length; j++) { System.out.print(appended[i][j]+", "); } System.out.println(); } System.out.println("Should be the same as this"); for (int i = 0; i < expected.length; i++) { for (int j = 0; j < expected[i].length; j++) { System.out.print(expected[i][j]+", "); } System.out.println(); } 

如果我理解正确的话,你想要在相反的维度上追加它,而不是DomS和MeBigFatGuy的想法。 如果我是对的,有两种方法:


如果在每个arrays中固定“列”高度(第二维的长度),则可以使用此方法。 如果数组具有不同的第一维长度,则会留下空白(零填充)单元格。 你可能想要使这段代码更安全

 /** * For fixed "column" height. "Blank cells" will be left, if the two arrays have different "width" */ static int[][] appendArray2dFix(int[][] array1, int[][] array2){ int a = array1[0].length, b = array2[0].length; int[][] result = new int[Math.max(array1.length,array2.length)][a+b]; //append the rows, where both arrays have information int i; for (i = 0; i < array1.length && i < array2.length; i++) { if(array1[i].length != a || array2[i].length != b){ throw new IllegalArgumentException("Column height doesn't match at index: " + i); } System.arraycopy(array1[i], 0, result[i], 0, a); System.arraycopy(array2[i], 0, result[i], a, b); } //Fill out the rest //only one of the following loops will actually run. for (; i < array1.length; i++) { if(array1[i].length != a){ throw new IllegalArgumentException("Column height doesn't match at index: " + i); } System.arraycopy(array1[i], 0, result[i], 0, a); } for (; i < array2.length; i++) { if(array2[i].length != b){ throw new IllegalArgumentException("Column height doesn't match at index: " + i); } System.arraycopy(array2[i], 0, result[i], a, b); } return result; } 

如果您希望允许列在每个数组中变化,则可以进行微小更改。 这不会留下任何空单元格。

 /** * For variable "column" height. No "blank cells" */ static int[][] appendArray2dVar(int[][] array1, int[][] array2){ int[][] result = new int[Math.max(array1.length,array2.length)][]; //append the rows, where both arrays have information int i; for (i = 0; i < array1.length && i < array2.length; i++) { result[i] = new int[array1[i].length+array2[i].length]; System.arraycopy(array1[i], 0, result[i], 0, array1[i].length); System.arraycopy(array2[i], 0, result[i], array1[i].length, array2[i].length); } //Fill out the rest //only one of the following loops will actually run. for (; i < array1.length; i++) { result[i] = new int[array1[i].length]; System.arraycopy(array1[i], 0, result[i], 0, array1[i].length); } for (; i < array2.length; i++) { result[i] = new int[array2[i].length]; System.arraycopy(array2[i], 0, result[i], 0, array2[i].length); } return result; } 

从DomS修改的测试代码

 public static void main(String[] args) { //Test Var int[][] array1 = new int[][] { {1, 2, 3}, {3, 4, 5, 6}, }; int[][] array2 = new int[][] { {11, 12, 13,14 }, {13, 14, 15, 16, 17}, }; int[][] expected = new int[][] { {1, 2, 3, 11, 12, 13, 14}, {3, 4, 5, 6, 13, 14, 15, 16, 17} }; int[][] appended = appendArray2dVar(array1, array2); System.out.println("This"); for (int i = 0; i < appended.length; i++) { for (int j = 0; j < appended[i].length; j++) { System.out.print(appended[i][j]+", "); } System.out.println(); } System.out.println("Should be the same as this"); for (int i = 0; i < expected.length; i++) { for (int j = 0; j < expected[i].length; j++) { System.out.print(expected[i][j]+", "); } System.out.println(); } //Test Fix array1 = new int[][] { {1, 2, 3, 4}, {3, 4, 5, 6}, }; array2 = new int[][] { {11, 12, 13}, {13, 14, 15}, }; expected = new int[][] { {1, 2, 3, 4,11, 12, 13}, {3, 4, 5, 6, 13, 14, 15} }; appended = appendArray2dFix(array1, array2); System.out.println("This"); for (int i = 0; i < appended.length; i++) { for (int j = 0; j < appended[i].length; j++) { System.out.print(appended[i][j]+", "); } System.out.println(); } System.out.println("Should be the same as this"); for (int i = 0; i < expected.length; i++) { for (int j = 0; j < expected[i].length; j++) { System.out.print(expected[i][j]+", "); } System.out.println(); } } 

我猜是通过“追加”你的意思是用另一行的行来扩展矩阵的行数? 在这种情况下,2个数组/矩阵必须具有相同的列数 ! 因此,例如你可以用b [100] [6]附加[7] [6],这将通过简单地将b的100行附加到7行来产生数组c [107] [6] – 但这仅仅是因为它们两个都有6列。 例如用b [100] [6]附加[7] [3]是没有意义的! 因此,您的function必须预先强制执行这些function。 不,如果不编写自己的Java,就没有办法在Java中执行此操作,这将是这样的:

 int[][] appendArray( empty, window ) { if( empty[0].length != window[0].length ) throw new IllegalArgumentException( "Wrong column size" ); int[][] result = new int[empty.length + window.length]; for( int i = 0; i < empty.length; i++ ) System.arrayCopy( empty[i], 0, result[0], 0, empty[i].length ); for( int i = 0; i < window.length; i++ ) System.arrayCopy( window[i], 0, result[i + empty.length], 0, window[i].length ); return result; }