我试图编写一个方法,将一个二维数组作为输入,并返回一个新的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;
}
答案 0 :(得分:2)
关于,
但代码卡在一个循环中,我不认为它正在做它应该做的事情。
下面:
for (int h = 0; h < correctedSums[1].length; i++) {
此循环永远不会结束,因为h
永远不会在循环内发生变化。它应该是:
for (int h = 0; h < correctedSums[1].length; h++) {
如果你在调试器中运行代码,或者使用println,你就会知道代码卡在哪个循环中,这样你就可以立即检查并纠正它。