謹(jǐn)慎在遍歷數(shù)組時刪除元素

我們想要刪除數(shù)組中的符合條件的元素時,經(jīng)常對數(shù)組進(jìn)行遍歷,然后刪除。但是這其中更確隱藏著很大的問題。如果當(dāng)初能夠仔細(xì)的分析一下,也不會導(dǎo)致今天的錯誤了。

比如我們有一個數(shù)組 CCArray *array;包含了value值分別為1~5的NSNumber對象,現(xiàn)在我們想刪除其中value為1和2的兩個對象,我們可能會這樣操作:

1.? for(NSNumber * number in array)

2.? {

3.? ? ? ? ? CCLOG(@"number:%@ ",[number description]);

4.? ? ? ? ? if([number intValue]==2||[number intValue]==1) {

5.? ? ? ? ? ? ? [array removeObject:number];

6.? ? ? ? ? ? ? CCLOG(@"delete:%@ ",[number description]);

7.? ? ? ? ? }

8.? ? }

但這樣操作,只會刪除value為1的對象。因為刪除這個對象后,array的count減少了,被刪掉的對象后面的元素會向前移動,這樣在這個for循環(huán)中就會漏掉1后面的那個對象,而且測試也發(fā)現(xiàn),雖然循環(huán)中間刪除了一個元素,但循環(huán)的次數(shù)并沒有減少,只不過最后兩次都是最后一個元素。

打印的值如下:

l? number:0

l? number:1

l? delete:1

l? number:3

l? number:4

l? number:4

如果我們使用如下的循環(huán)方式:

for (int i=0;i<[array count];i++) {

NSNumber *number = [array objectAtIndex:i];

CCLOG(@"number %d:%@ ",i,[number description]);

if ([number intValue]==2||[number intValue]==1) {

[array removeObject:number];

CCLOG(@"delete:%@ ",[number description]);

}

}

打印的值會變?yōu)椋?/p>

l? Number 0:0

l? Number 1:1

l? delete:1

l? number 2:3

l? number 3:4

可見同樣的問題,在刪除value為1的對象后,計數(shù)器增長為2,但此時數(shù)組中下標(biāo)為2的元素已經(jīng)變成了之前下標(biāo)為3的對象,因為刪除其中一個元素后,后面的所有元素都會向前移動,這個下標(biāo)都會改變。這樣變漏掉了一些元素。對于for in快速枚舉,還會多次執(zhí)行最后一個元素的遍歷,這些都是導(dǎo)致問題的隱患。

為了避免以上的問題,我們可以使用倒序的方式刪除:

int num = [array count];

for (int i=num-1;i>=0;i--) {

NSNumber *number = [array objectAtIndex:i];

CCLOG(@"number %d:%@ ",i,[number description]);

if ([number intValue]==2||[number intValue]==1) {

[array removeObjectAtIndex:i];

CCLOG(@"delete:%@ ",[number description]);

}

}

另外也可以通過創(chuàng)建臨時數(shù)組的方式來解決,將所有要保留的對象加入另外一個數(shù)組,并完全刪除原數(shù)組,或者將要刪除的元素加入臨時數(shù)組,然后執(zhí)行[CCArray removeObjectInArray:];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,899評論 0 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,537評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,641評論 18 399
  • 多少次了 我被賦予某種責(zé)任和使命 這個夜晚讓我感到成群的跳蚤要來偷襲 我被要求扛著刺刀上戰(zhàn)場 在一張大白紙上刺上口...
    舒嚴(yán)閱讀 444評論 0 0
  • 1.最觸動自己的段落原文 除了要有身體上的安全感,孩子們還需要情感上的安全感才能建立對這個世界的信任,確信這是一個...
    琴世黃閱讀 794評論 0 0

友情鏈接更多精彩內(nèi)容