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)。