外循环从某个位置开始

时间:2012-12-04 01:00:38

标签: java for-loop

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并放入该变量在循环的增量部分,但程序进入无限循环并永不停止,这有什么问题?

2 个答案:

答案 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),这将导致无限循环。

要解决此问题,请处理不匹配方案。