2013-04-14 128 views
-1
import java.util; 
class Driver{ 

public static void main(String[] args) { 
     ArrayList<String> lstStr = new ArrayList<String>(); 
     lsstStr.add("A"); 
     lsstStr.add("B"); 
     lsstStr.add("C"); 
     for(Iterator<String> it = lstStr.Iterator(); it.hasNext();) 
     { 
      str = it.next(); 
      if(str.equals("B")){lstStr.remove(str);} 
     } 
     for(Iterator<String> it = lstStr.Iterator(); it.hasNext();) 
     { 
     System.out.println(it.next()); 
     } 
} 
} 

這並不是從列表中刪除「B」。當第二次循環運行時,爲什麼Str不等於「B」?爲什麼?無法從ArrayList中刪除

+1

您的代碼目前不會編譯,因此它不會顯示任何內容。請給出一個編譯的例子,首先。你顯然沒有運行你發佈的代碼,所以我們不知道實際運行的代碼是什麼。 –

+0

此代碼將導致併發修改異常,因爲迭代器在從集合中刪除元素後變得不可用。你不要告訴我們這個,所以你可能還沒有試過。 – h22

回答

4

使用Iterator.remove無法刪除從你遍歷集合的項目除外 - 你會得到一個ConcurrentModificationException。所以,你的循環將是這樣的:

for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) { 
    String value = iterator.next(); 
    if (value.equals("B")) { 
     iterator.remove(); 
    } 
} 

當然,你應該使用removeAll只是刪除與特定值的所有項目 - 但上面的方法是,如果你需要的基礎上,除去使用一個除了簡單相等之外的其他一些條件(例如,「刪除所有長度大於5的值」)另一種方法是收集所有要刪除的值,然後再調用removeAll

3

試試這個:它會從列表中刪除所有出現的「B」而沒有任何循環。

lstStr.removeAll(Collections.singleton("B")); 
+0

import java.util。*; class Drive { public static void main(String [] args){ArrayList lstStr = new ArrayList (); lstStr.add(「A」); lstStr.add(「R」); lstStr.add(「C」); String str; (Iterator it = lstStr.iterator(); it.hasNext();) {\t \t str = it.next(); 如果(str.equals( 「R」)){lstStr.remove(它);}} 爲 (迭代它= lstStr.iterator(); it.hasNext();) { System.out的。的println(it.next()); } } } – Brometheus

+1

@Brometheus:請不要在這樣的評論中添加代碼 - 特別是沒有任何跡象表明*爲什麼*你這樣做。如果你想改變你的問題(你應該 - 爲了編譯它,如果沒有別的),你應該編輯問題,不要在答案上添加無意義的評論,或者在單獨的帖子中提出一個新問題。 –

0

使用迭代器的remove方法。它會從集合中刪除元素。