如何通过列向下迭代一个2D数组?我希望这是一个不规则的数组,但在常规数组中首先看到可能会工作



我希望我的数组从索引到索引,例如:(0,0),(1,0),(2,0)等。我已经尝试了似乎应该是正确的方式,但我的循环在第一列后停止,我得到一个索引越界异常。

我是这样做的:

int[][] array2d = 
{
{4,5, 3,8},
{8,3,99,6},
{5,7, 9,1}

}; 
int currentRow = 0;
for (int currentColumn = 0; currentColumn < (array2d[currentRow].length); currentColumn++) 
{ 
for(currentRow = 0; currentRow < array2d.length; currentRow++) 
{
System.out.println(array2d[currentRow][currentColumn]);
}
}

首先,让我们解决代码中的一个错误。考虑这个循环:

int i;
for (i = 0; i < 10; i++) { /* loop body */ }

循环运行,直到i < 10求值为false。在本例中,当循环退出时,i的值为10

考虑代码中的内循环:

for (currentRow = 0; currentRow < array2d.length; currentRow++) 

当此循环退出时,currentRow将等于array2d.length。然后,控制将返回到外部循环。当它发生时,在控制表达式currentColumn < (array2d[currentRow].length)中,array2d[currentRow]部分将抛出一个IndexOutOfBoundsException

正如你已经知道的,这是按列顺序遍历二维数组的标准方法,如下所示:

for (int row = 0; row < array2d.length; row++) { 
for (int column = 0; column < array2d[row].length; column++ { 
// things to do in inner loop
}

如果要按列顺序处理矩形2D数组,代码可能如下所示:

for (int column = 0; column < array2d[0].length; column++) { 
for (int row = 0; row < array2d.length; row++) {
// loop body
}
}

但是,如果数组是不规则的呢?

从查找开头具有最大列数的行开始:

int maxColumns = 0;
for (int i = 0; i < array.length; i++) { 
maxColumns = Math.max (maxColumns, array2d[i].length);
}
那么,你的代码可能看起来像这样:
for (int column = 0; column < maxColumns; column++) { 
for (int row = 0; row < array2d.length; row++) { 
if (column < array2d[row].length) {
// do something with array2d [row][column]
} else { 
// do something for the case where 
// array2d [row] doesn't have a value in "column" 
}
}
}

另一种选择可能是尝试捕获ArrayIndexOutOfBoundsException。然而,这可能被认为是一种糟糕的编程实践。

您需要在打印前获得最大列数。

public static void main(String[] args) {
int[][] array2d = {
{4, 5, 3, 8},
{},
{8, 6},
{2},
{5, 7, 9, 1, 0}
};
int maxRow = array2d.length;
int maxColumn = array2d[0].length;
for (int r = 1; r < maxRow; ++r)
maxColumn = Math.max(maxColumn, array2d[r].length);
for (int c = 0; c < maxColumn; ++c) {
for (int r = 0; r < maxRow; ++r)
if (c < array2d[r].length)
System.out.print(array2d[r][c] + " ");
else
System.out.print("* ");
System.out.println();
}
}

输出:

4 * 8 2 5 
5 * 6 * 7 
3 * * * 9 
8 * * * 1 
* * * * 0 

或者您可以通过再次扫描该行来摆脱它。

public static void main(String[] args) {
int[][] array2d = {
{4, 5, 3, 8},
{},
{8, 6},
{2},
{5, 7, 9, 1, 0}
};
int rowSie = array2d.length;
for (int c = 0; true; ++c) {
StringBuilder sb = new StringBuilder();
boolean out = false;
for (int r = 0; r < rowSie; ++r)
if (c < array2d[r].length) {
sb.append(array2d[r][c]).append(" ");
out = true;
} else
sb.append("* ");
if (!out)
break;
System.out.println(sb);
}
}

输出:

4 * 8 2 5 
5 * 6 * 7 
3 * * * 9 
8 * * * 1 
* * * * 0 
int[][] array2d =
{
{1,2,3,4},
{5,6,7,8},
{ 9,10,11,12}
};
int r=array2d.length,c=array2d[0].length;
for (int i=0;i<c;i++)
{
for(int j=0;j<r;j++)
{
System.out.print(array2d[j][i]+" ");
}
System.out.println();
}

你在行之前运行了列,因为它是一个长度为3x4的2d数组,它在迭代数组时给出一个indexOutOfBoundsException。

相关内容

  • 没有找到相关文章

最新更新