2012-12-04 18 views
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中,並將該變量放在循環的增量部分,但程序會進入無限循環並永不停止,那麼問題是什麼?外for循環從某一位置

回答

0

您在每次迭代時都設置i = lastFound。在外循環開始時,初始化lastFoundi + 1。這樣它會正常增加,如果你不重置lastFound

或者,擺脫lastFound,當你找到一個匹配,設置i = i - 1,在i + 1而不是i啓動k循環,並在外環改變增量表達式從i = 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]); 
     } 
    } 
} 
0

想:在第一次迭代中,

i = 0 

現在如果這是假的:this.arr[i] == this.arr[j]然後lastfound永遠不會改變(保持0) ,這將導致無限循環。

要解決該問題,請處理不匹配的情況。