如何使while循环正常工作以纠正给定的2D数组

时间:2015-08-22 13:49:41

标签: java arrays debugging

我试图编写一个方法,将一个二维数组作为输入,并返回一个新的2D数组,其中所有的零都从数组中删除。

此外,如果第一个数组中的某个元素的值等于第二个数组的长度,则应将其删除,并将第二个数组中的所有元素减去1.

对于第二个阵列也应该重复上述过程。

到目前为止,这是我为代码实现编写的内容,但代码陷入了循环,我不认为它正在做它应该做的事情

注意:调用ArrayUtils时,正在使用Apache Lang库,这是我输入的2D数组:

[[0, 0, 2, 2, 3, 4], [0, 0, 2, 2, 3, 4]]

代码:

public static int[][] removeTrivialCases(int[][] startingSums) {
    int[][] correctedSums = startingSums;

    int counter = 0;

    int numRows = correctedSums[0].length;
    int numCols = correctedSums[1].length;

    boolean zeroesExist = true;
    boolean valueEqualsDimension = true;

    boolean trivialCasesRemain = true;

    while(trivialCasesRemain) {
        for (int i = 0; i < correctedSums.length; i++) {
            for (int j = 0; j < correctedSums[i].length; j++) {
                if (correctedSums[i][j] == 0) {
                    trivialCasesRemain = true;
                    correctedSums[i] = ArrayUtils.removeElement(correctedSums[i], j);
                }

                for (int h = 0; h < correctedSums[i].length; h++) {
                    if (correctedSums[i][h] == 0) {
                        zeroesExist = true;
                    }
                }

            }
        } 

        for (int i = 0; i < correctedSums[0].length; i++) {
            if (correctedSums[0][i] == numCols) {
                trivialCasesRemain = true;
                correctedSums[0] = ArrayUtils.removeElement(correctedSums[0], i);
                for (int j = 0; j < correctedSums[0].length; j++) {
                    correctedSums[0][j]--;
                }

                valueEqualsDimension = false;

                for (int h = 0; h < correctedSums[0].length; h++) {
                    if (correctedSums[0][h] == numCols) {
                        valueEqualsDimension = true;
                    }
                }
            }
        }   

        for (int i = 0; i < correctedSums[1].length; i++) {
            if (correctedSums[1][i] == numRows) {
                trivialCasesRemain = true;
                correctedSums[1] = ArrayUtils.removeElement(correctedSums[1], i);
                for (int j = 0; j < correctedSums[1].length; j++) {
                    correctedSums[1][j]--;
                }
            }

            valueEqualsDimension = false;

            for (int h = 0; h < correctedSums[1].length; i++) {
                if (correctedSums[1][h] == numRows) {
                    valueEqualsDimension = true;
                }
            }
        }

        if (!zeroesExist || !valueEqualsDimension) {
            trivialCasesRemain = false;
        }
    }

    return correctedSums;
}

1 个答案:

答案 0 :(得分:2)

关于,

  

但代码卡在一个循环中,我不认为它正在做它应该做的事情。

下面:

for (int h = 0; h < correctedSums[1].length; i++) {

此循环永远不会结束,因为h永远不会在循环内发生变化。它应该是:

for (int h = 0; h < correctedSums[1].length; h++) {

如果你在调试器中运行代码,或者使用println,你就会知道代码卡在哪个循环中,这样你就可以立即检查并纠正它。