JAVA将2维数组的对角线写入1维数组
问题描述:
想要将2维数组(n * n矩阵)的对角线写入一维数组。JAVA将2维数组的对角线写入1维数组
1 2 3
4 5 6 => 1 5 9
7 8 9
public int[] getDiagonalFromArray(int[][] two_d_array){
int[] diagonal_array = new int[two_d_array[0].length];
int k=0;
for (int i = 0; i < two_d_array[0].length; i++) {
for (int j = 0; j < two_d_array[1].length; j++) {
for (int l = 0; l < two_d_array[0].length; l++) {
diagonal_array[k]=two_d_array[i][j];} //HERE SHOULD BE THE ERROR... HOW DO I CYCLE THROUGH THE 1dim "diagonal_array"?
}
}
return diagonal_array;
}
这种方法提供了错误的价值观。
这种挖矿方法,只是打印diagonale,而不是放入1dim数组中。
public void getDiagonal(int[][] two_d_array){
//int[] diagonal_array = new int[two_d_array[0].length];
for (int i = 0; i < two_d_array[0].length; i++) {
for (int j = 0; j < two_d_array[1].length; j++) {
if (i==j) System.out.print(two_d_array[i][j]+" ");
}
}
}
逻辑差异在哪里?我尝试了第一种方法的if子句,但它引发了“outofbound”-Exception。
在此先感谢。
答
为什么你需要多个循环?
for (int i = 0; i < two_d_array[0].length; i++) {
diagonal_array[i]=two_d_array[i][i];
}
似乎对我来说就够了。
答
如果您的矩阵具有相同的宽度和高度,这是一个解决方案:
public int[] getDiagonal(int[][] two_d_array){
int[] diagonal_array = new int[two_d_array.length];
for (int i = 0; i < two_d_array.length; i++) {
diagonal_array[i] = two_d_array[i][i];
}
return diagonal_array;
+1
“如果您的矩阵具有相同的宽度和高度” - 如果没有,则没有清晰的对角线。 – Andreas
答
在这里,我考虑主对角线元素是元素集合,其中n
& m
是行数的和列数(每行?)。
因此,对角元素的数量永远不会大于min(numOfRows, numOfColumns)
。
所以,你可以尝试:
public int[] getDiagonalFromArray(int[][] 2DArray){
int[] diagonalArray = new int[Math.min(2DArray.length, 2DArray[0].length]);
int k=0;
for (int i = 0; i < 2DArray.length && k < diagonalArray.l length; ++i) {
for (int j = 0; j < 2DArray[i].length && k < diagonalArray.l length; ++j) {
if (i == j) {
diagonalArray[k++]=2DArray[i][j];
}
}
}
return diagonalArray;
}
加送一些边界检查的好办法。
您的输入矩阵必须至少为矩形(正方形最有意义),否则代码将表现不可靠。
这与@Andreas' answer相同,但为了理解,我牺牲了性能和简洁性。
1维 - > 1循环。不确定其他两个循环是什么。 – tkausl
第一个循环不应该循环到'two_d_array [0] .length',而应该是'two_d_array.length'。不知道你为什么有三个循环?我建议只使用下面提出的解决方案之一。 – 2016-12-14 14:11:57