我一直在尝试在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<array1.length;i++) {
ret[i] = array1[i];
}
for (int j = 0;j<array2.length;j++) {
ret[i++] = array2[j];
}
return ret;
}
此快速代码将对其进行测试-
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认为相反的方向。如果我是对的,有两种方法:
如果每个数组中的“列”高度(第二维长度)都固定,则可以使用此方法。如果数组的第一维长度不同,则将保留空白(零填充)单元格。为了使此代码更安全,您可能需要[]
/** * 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个数组/矩阵必须具有相同的列数
带有流的单线