2013-04-14 201 views
-3
import java.util.*; 
class Drive{ 
    public static void main(String[] args) { 
     ArrayList<String> lstStr = new ArrayList<String>(); 
     lstStr.add("A"); 
     lstStr.add("R"); 
     lstStr.add("C"); 
     String str; 
     for(Iterator<String> it = lstStr.iterator(); it.hasNext();) { 
      str = it.next(); 
      if(str.equals("R")) { 
       lstStr.remove(it); 
      } 
     } 
     for(Iterator<String> it = lstStr.iterator(); it.hasNext();) { 
      System.out.println(it.next()); 
     } 
    } 
} 

無法理解發生了什麼,爲什麼R不會從ArrayList中刪除?ArrayList元素沒有刪除

+1

呵呵? http://stackoverflow.com/q/15996981/106261 – NimChimpsky

+1

你是認真的嗎?您20分鐘前發佈了相同的問題,重新發布不會幫助您找到答案,請刪除此問題。 – BackSlash

+0

http://docs.oracle.com/javase/6/docs/api/java/util/Iterator.html#remove() – AurA

回答

3
if(str.equals("R")) 
    lstStr.remove(it); 

上面應該是:

if(str.equals("R")) 
    it.remove(); 
+0

我認爲remove方法總是需要一個參數時用於ArryaList。 – Brometheus

+0

它應該是iterator.remove(); – NINCOMPOOP

+0

@noob謝謝。 –

1

使用迭代器的remove方法一樣,

List<String> lstStr = new ArrayList<String>(); 
lstStr.add("A"); 
lstStr.add("R"); 
lstStr.add("C"); 
String str; 

for(Iterator<String> it = lstStr.iterator(); it.hasNext();) 
{ 
    str = it.next(); 
    if(str.equals("R")) 
    { 
     it.remove(); 
    } 
} 

for(Iterator<String> it = lstStr.iterator(); it.hasNext();) 
{ 
    System.out.println(it.next()); 
} 

此類的迭代器返回與該迭代器的ListIterator 方法是快速失敗的:如果在創建迭代器後的任何 時間結構上修改列表,則在任何wa除非通過 迭代器自身的remove或add方法 Y,迭代器都將拋出 ConcurrentModificationException的。

http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html

+0

爲什麼lstStr.remove(「R」)不起作用? – Brometheus

+0

@Brometheus:編輯答案。 – Lion

+0

在你的問題中,你提供'iterator'作爲'remove()'方法的一個參數,這是錯誤的 - 'lstStr.remove(it);'。 – Lion

2

請使用Iterator的去除方法,當你試圖安全地從List刪除任何東西。根據API,void remove():從底層集合中刪除迭代器返回的最後一個元素(可選操作)。這種方法只能在下一次調用時調用一次。如果除了通過調用此方法以外的任何其他方式進行迭代時修改了底層集合,則未指定迭代器的行爲。

你的代碼需要小幅調整:

for(Iterator<String> it = lstStr.iterator(); it.hasNext();) 
{ 
    str = it.next(); 
    // instead of iterator "it" put string "str" as argument to the remove() 
    if(str.equals("R")){lstStr.remove(str);} 
} 

雖然上面的代碼將在工作你的情況,但也有大量的邊緣情況下它會失敗。最好的辦法是:

for(Iterator<String> it = lstStr.iterator(); it.hasNext();) 
{ 
    str = it.next(); 
    // use iterator's remove() 
    if(str.equals("R")){ it.remove();} 
}