現在有這麼乙個需求,刪除陣列中值為1的項,這個問題看起來非常簡單,可實際上非常容易出錯,而且很有可能自己都沒發現,一般我們是這麼處理的:
初始化10萬條資料:
for (int i = 0; i
< 100000; i++)
刪除 =1 的項:
for (int i = 0; i < list.size(); i++)
}
執行結果:
我們一看沒問題啊,我們以為已經解決了,如果我們刪除1和2的值,
if (list.get(i) == 1 || list.get(i) == 2)
}你會發現怎麼指刪除了10000條資料啊,怎麼和只刪除1的結果一樣啊,你的第一反應是不是**寫錯了,於是又看了看,沒錯啊,這個 時候我們就要好好分析下了:
資料集合:[0,1,2,3,4,5,6,7,8,9,0,1….]
第一步:i=0,list.get(i) =0,過。
第二步:i=1,list.get(i) =1,刪除當前項,
此時的資料集合變為:[0,2,3,4,5,6,7,8,9,0,1….]
第三步:i=2,list.get(i) =3,就是這看好了,由於刪除了一項導致列表發 生變化,使原資料的第三項跳過了。
到這裡我們已經明白為什麼出錯了,找到了原因解決起來也就比較簡單了我總結了幾個解決方法:
1、遞迴方法,就是每次刪除後重新開始:
private
void
delete1()}}
這種方法其實我不想介紹的,不過後來想想我們可以當成反面教材嘛,這種方法效率慘不忍睹,任何時候不到萬不得已千萬不要用遞迴。
2、根據出錯的分析我們可以在刪除時執行i–:
if (list.get(i) == 1 || list.get(i) == 2)
}3、倒敘執行:
if (list.get(i) == 1 || list.get(i) == 2)
}4、使用iterator
while (iterator.hasnext())
}使用2、3、4都可以達到我們想要的效果,從10萬條資料測試的效率來看都在800ms左右,不過我還是建議使用iterator。
ArrayList刪除偶數
最近去面試,面試官一直問arraylist和linkedlist的區別,然後問如果給你乙個arraylist集合,然後刪除掉其中的偶數,你會怎麼做,我當時想了沒想就說首先遍歷集合,然後判斷當前元素是否 是偶數,若是則呼叫remove方法。後來回來查詢了一下,其實可以通過add方法來替換remove方...
ArrayList的資料刪除
在開發的過程中發現arraylist移除不了乙個資料 直接說原因刪除目標的實體未實現equals方法。正如如下 public class testremove class person public person string name public string getname public vo...
ArrayList中資料刪除
在迴圈arrayllist時,經常會遇到remove操作,那麼arraylist的remove的底層是怎麼做的?abstractlist中,有乙個屬性modcount,這個屬性是跟蹤list中資料被修改的次數,任何對list的add remove操作,都將導致modcount 在abstractli...