public void removeDups() {
int i, k, j, lastFound = 0;
if (this.nElements < 1) {
System.out.println("Empty Array");
} else {
for (i = 0; i < this.nElements; i = lastFound) //outer loop
{
for (j = i + 1; j < this.nElements; j++) {
if (this.arr[i] == this.arr[j]) {
lastFound = i;
for (k = i; k < this.nElements; k++) {
this.arr[k] = this.arr[k + 1];
}
this.nElements--;
break;
}
}
}
for (i = 0; i < this.nElements; i++) {
System.out.println(this.arr[i]);
}
}
}
前一个方法从调用它的对象(Array)中删除重复项,问题是我希望外循环从每个增量的某个位置开始,我将该位置的值赋给变量lastFound并放入该变量在循环的增量部分,但程序进入无限循环并永不停止,这有什么问题?
答案 0 :(得分:0)
您在每次迭代时都设置i = lastFound
。在外部循环的开头,将lastFound
初始化为i + 1
。这样,如果您不重置lastFound
,它将正常增加。
或者,摆脱lastFound
,当找到匹配项时,设置i = i - 1
,在k
而不是i + 1
开始i
循环,将外循环中的增量表达式从i = lastFound
更改为i++
。我还会使用System.arraycopy
:
public void removeDups() {
if (nElements < 1) {
System.out.println("Empty Array");
} else {
for (int i = 0; i < nElements; i++) {
for (int j = i + 1; j < nElements; j++) {
if (arr[i] == arr[j]) {
System.arraycopy(arr, i + 1, arr, i, nElements - (i + 1));
nElements--;
i--;
break;
}
}
}
for (i = 0; i < nElements; i++) {
System.out.println(arr[i]);
}
}
}
答案 1 :(得分:0)
想一想:在第一次迭代中,
i = 0
现在如果这是假的:this.arr[i] == this.arr[j]
那么lastfound
永远不会改变(保持为0),这将导致无限循环。
要解决此问题,请处理不匹配方案。