遍歷數組並且刪除其中某個元素

今天寫課程設計的代碼,在程序中有一部分代碼涉及到遍歷整個數組,並且檢查數組中的每一個元素是否符合要求,對於不符號要求的數組元素刪除之,剛開始的時候,就像平常寫遍歷數組的方式遍歷,並且檢查數組中的元素,對於不符合的刪除它,代碼片段如下:
for (int i = 0; i < borrowList.size(); i++) {
					if(!( borrowList.get(i).getBroRecord().getEndDate().after(currntDate) && borrowList.get(i).getBroRecord().getTimeCount() > 0) )
					{
						borrowList.remove(i);
					}
				}
但是,通過測試發現,這種方式並不能夠達到預期的結果,通過簡單的思考發現,這種問題曾經遇到過,產生這種邏輯錯誤的原因是當每一次刪除一個元素的時候,整個數組發生了變化,數組長度發生了變化,但是此時i並沒有重新回到0,導致不能夠從頭開始遍歷數組,從而,導致錯過了數組中元素i之前的元素的遍歷。經過上述思考之後,我代碼改成如下的樣子:
for (int i = 0; i < borrowList.size(); i++) {
					if(!( borrowList.get(i).getBroRecord().getEndDate().after(currntDate) && borrowList.get(i).getBroRecord().getTimeCount() > 0) )
					{
						borrowList.remove(i);
						i = -1;
					}
				}

然後就達到了預期的結果。


總結:

通過這個邏輯上的錯誤,得到一條經驗:當需要遍歷一個容器時並且需要刪除其中某個元素的時候,在每次刪除一個元素之後都需要在從頭開始遍歷這個容器(就是將容器的遍歷標記變成剛開始的值)。

下面介紹一下for循環語句的執行過程:

for循環的執行順序用如下表達式:

for(expression1;expression2;expression3)
 {   
            expression4;
 }
      執行的順序應該是:
1)第一次循環,即初始化循環。
      首先執行表達式expression1(一般爲初始化語句);再執行expression2(一般爲條件判斷語句),判斷expression1是否符合expression2的條件;如果符合,則執行expression4,否則,停止執行;最後執行expression3。

2)第N(N>=2)次循環
      首先執行expression2,判斷在expression3是否符合在expression2要求;如果符合,則繼續執行在expression4,否則,停止執行。最後執行在expression3。如此往復,直至expression3不滿足在expression2條件是爲止。

總結:
      總的來說,執行的順序是一致的。先條件判斷(expression2),再函數體執行(expression4),最後for執行(expression3)。往復......區別在於,條件判斷的對象。第一次判斷時,對象爲初始化語句(expression1),後續的判斷對象爲執行後的結果(expression3)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章