0
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]);

        }




    }

}

上一个方法从调用它的对象(数组)中删除重复项,问题是我希望外循环从每个增量的某个位置开始,我将该位置的值分配给变量 lastFound 并将该变量放入增量中循环的一部分,但程序进入无限循环并且永远不会停止,那有什么问题?

4

2 回答 2

0

i = lastFound在每次迭代中进行设置。在外循环开始时,初始化lastFoundi + 1. 这样,如果您不重置,它将正常增加lastFound

lastFound或者,当你找到一个匹配项时,去掉and 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]);
        }
    }
}
于 2012-12-04T01:03:28.203 回答
0

想一想:在第一次迭代中,

   i = 0

现在如果这是错误的:this.arr[i] == this.arr[j] then lastfoundis never changed(remains 0),这将导致无限循环。

要解决此问题,请处理不匹配的情况。

于 2012-12-04T01:15:12.397 回答