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 = 0

これがfalseの場合、this.arr[i] == this.arr[j] 変更lastfoundされることはありません(0のまま)。これにより、無限ループが発生します。

この問題を解決するには、一致しないシナリオを処理します。

于 2012-12-04T01:15:12.397 に答える
0

i = lastFoundすべての反復で設定しています。外側のループの開始時に、に初期化lastFoundi + 1ます。そうすれば、リセットしない場合は通常どおりに増加しますlastFound

または、lastFound一致するものを削除して、を設定し、の代わりにでループをi = i - 1開始し、外側のループの増分式をからに変更します。また、次を使用してコードを簡略化します。ki + 1ii = lastFoundi++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 に答える