【问题标题】:Java how to check if a row is empty in a 2d array.Java如何检查二维数组中的一行是否为空。
【发布时间】:2016-10-28 15:51:36
【问题描述】:

假设我有一个如下所示的二维数组 (G):

0  0  0  0  0  12 13 0 
0  0  6  0  0  0  0  3 
0  6  0  4  0  0  0  5
0  0  4  0  10 0  0  7
0  0  0  10 0  11 8  9
12 0  0  0  11 0  1  0 
13 0  0  0  8  1  0  2
0  3  5  7  9  0  2  0

我必须遍历这样的数组并找到不为零的最小值。在我找到最小值后,我将它添加到另一个名为 H 的二维数组,它是空的,但与 G 具有相同的大小。一旦我将值添加到 H,然后我将 G 中的值设置为零并再次遍历数组以找到第 2 个最小值,然后是第 3 个,然后是第 4 个,依此类推。当 H 中的每一行都有一个值时,我停止遍历数组。所以对于上面的数组,在我第一次通过时,我会发现 1 是最低值,所以我将它添加到 H 中,如下所示:

0  0  0  0  0  0  0  0 
0  0  0  0  0  0  0  0 
0  0  0  0  0  0  0  0
0  0  0  0  0  0  0  0
0  0  0  0  0  0  0  0
0  0  0  0  0  0  1  0 
0  0  0  0  0  1  0  0
0  0  0  0  0  0  0  0

这是我用java写的:

int numVerts = G.length;
int [][] H = new int[numVerts][numVerts];
while (/*there exists an empty row in H*/){
    for (int i = 0; i < numVerts; i++){
        for (int j = 0; j < numVerts; j++){
            if ((G[i][j] != 0) && (G[i][j] < minWeight)){
                minWeight = G[i][j];
                k = i;
                l = j;
            }
        }
    }
    H[k][l] = minWeight;
    H[l][k] = minWeight;
    G[k][l] = 0;
    G[l][k] = 0;
}

所以我可以以任何我想要的方式解决这个问题,这就是我选择解决它的方式。所以我唯一要弄清楚的是,我如何判断 H 中的所有行是否至少有 1 个值,而不是直接遍历 H,因为我已经遍历 G 并在 H 的某些位置添加值。

【问题讨论】:

  • 它是空的,但与 G 大小相同:这是矛盾的。根据定义,空数组的大小为 0。H 与 G 具有相同的宽度和高度,但用 0 填充,对吗?除非维度很大,否则不遍历 H 是过早的优化。但是您可以只使用 Set 包含用零填充的行集。每次将非零数字添加到行时,从集合中删除该行。当集合为空时,您就完成了。

标签: java arrays algorithm traversal minimum-spanning-tree


【解决方案1】:

您不想再次遍历 H。因此,您必须以某种方式存储 H 中放置新值的行。

您可以创建一个布尔数组,其大小与 H 中的行数相同。然后每次向 H 添加一些内容后,您在布尔数组中将该行的值设置为 true。然后遍历布尔数组并查看值是否仍然为假。如果不是这样,你就完了。

【讨论】:

  • 如果遍历一个布尔数组太多了,你可以用一个计数器来补充这个解决方案。每当您将布尔数组中的条目从 false 更改为 true 时,都会增加计数器。当计数器到达numVerts 时,您就完成了。
  • 忽略最后一条关于它无限循环的评论。我发现我必须将值两次添加到 H 中,所以我添加以将 bool 计数增加 2。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2013-08-26
  • 1970-01-01
  • 2022-01-05
  • 2020-12-14
相关资源
最近更新 更多