2012-02-16 121 views
4

我在嘗試一個練習,我將1000個元素添加到arraylist中,然後再次從列表中系統地刪除它們(通過指定索引)。這背後的想法是比較LinkedList和ArrayList的性能。循環遍歷並刪除指定索引處的元素

int totalObjects = 0; 
    for(int i = 0; i < 1000; i++) 
    { 
     totalObjects += 1; 
     al.add("Object " + totalObjects); 

    } 
    System.out.println("The Arraylist size is " + al.size()); 

如果我做下面的事情,只有一半的元素被刪除...爲什麼?

for(int index = 0; index < al.size(); index++) 
    { 

     al.remove(index); 

    } 
    System.out.println("The Arraylist size after removal is " + al.size()); 

親切的問候 阿里安

回答

11

這是因爲你改變刪除索引。如果刪除元素0,則元素1現在變成元素0.現在,當您刪除1時,以前是元素2,元素1仍然存在於索引0處。

避免這種情況的最簡單方法是從末端開始向後循環。

或者,您可以繼續刪除索引0,直到ArrayList爲空。

+0

我明白了......謝謝 – Arianule 2012-02-16 15:11:43

8

請注意,您可以通過簡單的使用方法clear()刪除一次的所有元素。在你的代碼中,問題在於列表在你迭代的同時被修改,有效地減小了它的大小,所以index < al.size()條件失敗。試試這個:

for (int index = 0, n = al.size(); index < n; index++) 
    al.remove(0); 

另外,該解決方案在最後刪除的元素,使之更爲高效(它不再需要四處複製的元素):

for (int idx = al.size() - 1; idx >= 0; idx--) 
    al.remove(idx); 
+0

遍歷我不知道這就是問題所在 – f2lollpll 2012-02-16 15:06:34

2

因爲當您從ArrayList刪除元素時,其索引正在更新。因此,您現在刪除位置0處的元素,並且位置1處的元素現在位於索引0位置。因此,當您刪除索引爲1的元素時,您將在原始ArrayList的索引2處拉動刪除元素,依此類推。

1

刪除項目時,它將收縮列表。

比方說,你有項0 1和2

你的指數是0

您刪除0,你的指數現在是1,刪除2的原因是現在索引1

使感覺?

+0

是的,現在有道理......謝謝 – Arianule 2012-02-16 15:19:33

1

這是正常的,只有一半的列表是空的,因爲當您從列表中刪除元素列表的大小減少,但索引增加。他們在中間相遇。如果你真的想逐個刪除元素,並從最後一個元素中刪除。我建議你使用:

while (!al.isEmpty()) 
{ 

    al.remove(al.indexOf(al.size()-1)); 

} 
2

通過你看循環你去除元素再次。每次刪除元素時,由al.size()返回的值都會減少,而索引值則會增加。這意味着你只會迭代你想要的一半時間。

解決的辦法是做到這一點。

int size = al.size(); 
for(int index = 0; index < size; index++) { 

然後做功。這種方式的大小不會改變。

其他的事情要記住的是,當你在索引0刪除ArrayList的東西,索引1將成爲指數0,所以它可能是更好地

int index = al.size(); index >=0 ; index-- 
+0

'int index = al.size()'不是ArrayList中的有效索引,正確的表達式是'int index = al.size ()-1' – 2012-02-16 15:29:57

+0

這是事實,它是傳達一個觀點。不要複製和粘貼代碼 – rayred 2012-02-16 15:39:07