我有一个二维数组int矩阵[numNodes] [numArcs]。这是一个发生率矩阵。
现在,如果我们想要添加弧,我们必须检查这些节点是否存在并且弧不存在。这部分效果很好。我需要做的是,找到一个空列来添加弧。所以矩阵在开始时充满了零。所以很简单,你搜索每一列,直到找到一个满是零的列。听起来很简单,但它现在正在运作。这部分代码如下:
outerloop:
for (int i = 0; i < numArcs; i++){
for (int j = 0; j < numNodes; j++){
if (matriz[j][i] != 0)
break;
//It finds a number != 0 so it should move to the next column
//If it gets here, the whole column was full of zeros
column = i;
key = true;
break outerloop;
}
}
我用密钥知道我发现了这个列,因为如果我不这样做,因为矩阵已满,我需要复制它。这是另一个与此问题无关的问题。
现在,我试图弄清楚问题,我注意到以下几点:它只检查这些位置:
01
02
03
03
正如您所看到的,它只是检查每列的第一个位置而不是一直向下的方式。对我来说没有任何意义。在我的例子中,NumNode是10,所以它应该一直向下。
编辑: 我的确切例子 矩阵是这样的:
-1 -1 -1 0 0 0 ....
0 1 0 0 0 ...
0 0 1 0 0 .....
所以当它到达第四列时,它读取零并返回空列。 对于我添加的下一个n弧,它也是如此。我添加的以下弧不再触及第一行。 谢谢你的帮助
答案 0 :(得分:1)
for (int i = 0; i < numArcs; i++){
for (int j = 0; j < numNodes; j++){
if (matriz[j][i] != 0)
break;
//It finds a number != 0 so it should move to the next column
//If it gets here, the whole column was full of zeros
column = i;
key = true;
break outerloop;
}
}
如果在内部循环中,您没有第一次中断,那么您将i
存储到列中,而不检查该列的其他行。
您可以更好地使用布尔标志变量来检查您想要的内容..
int[][] matrix = new int[5][4];
boolean columnEmpty = true;
int column = 0;
boolean key = false;
matrix[0][0] = -1;
matrix[0][1] = -1;
matrix[1][1] = 1;
matrix[1][2] = -1;
matrix[2][2] = -1;
outerloop: for (int i = 0; i < 5; i++){
columnEmpty = true;
for (int j = 0; j < 4; j++){
if (matrix[j][i] != 0) {
columnEmpty = false;
break;
}
}
if (columnEmpty) {
// If we are here.. then flag was never set to `true`.
// So, all the rows for that column was Zero..
column = i;
key = true;
break outerloop;
}
}
System.out.println("Column : " + column);