2014-09-01 87 views
-2

在遍歷列表時,可能會刪除項目。迭代時從列表中刪除項目

private void removeMethod(Object remObj){ 
    Iterator<?> it = list.iterator(); 
    while (it.hasNext()) { 
     Object curObj= it.next(); 
     if (curObj == remObj) { 
      it.remove(); 
      break; 
     } 
    } 
} 

當上面的代碼可能發生在另一個循環中時,會發生問題,該循環正在主動迭代原始列表。

private void performChecks(){ 
    for(Object obj : list){ 
     //perform series of checks, which could result in removeMethod 
     //being called on a different object in the list, not the current one 
    } 
} 

如何從遍歷列表中刪除未知對象?

我有偵聽的對象的列表。在通知事件的聽衆時,可能不再需要其他聽衆。

+1

您是否嘗試過使用增強for循環和.remove()方法?和一個同步類? – arielnmz 2014-09-01 23:25:48

+1

你的問題不清楚給我。任何例子? – 2014-09-01 23:27:19

+1

removeMethod的加強for循環?這會拋出[ConcurrencyModificationExceptionError](http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html) – 2014-09-01 23:27:20

回答

0

如果我正確理解你的問題,以下是可能的解決方案(可能不是最有效的,但我認爲是值得一試):每次:

在performChecks()使用for(Object obj : list.toArray())

優勢該列表被「刷新」到數組中,它將反映這些變化。 因此,如果項目從單獨的循環中的列表中刪除

0

您的問題有點混亂,所以我會回答我認爲我理解的東西;你的問題是這樣的:如何從列表中刪除一個項目,同時迭代列表並刪除項目或如何避免ConcurrentModificationException

首先,代碼中的問題是您使用迭代器而不是列表來移除項目。其次,如果你使用的併發性,使用CopyOnWriteArrayList

list.remove()

提供場景一個很好的例子刪除的項,檢查this

所以這是不好:

List<String> myList = new ArrayList<String>(); 

    myList.add("1"); 
    myList.add("2"); 
    myList.add("3"); 
    myList.add("4"); 
    myList.add("5"); 

    Iterator<String> it = myList.iterator(); 
    while(it.hasNext()){ 
     String value = it.next(); 
     System.out.println("List Value:"+value); 
     if(value.equals("3")) myList.remove(value); 
    } 

,這是很好的:

List<String> myList = new CopyOnWriteArrayList<String>(); 

    myList.add("1"); 
    myList.add("2"); 
    myList.add("3"); 
    myList.add("4"); 
    myList.add("5"); 

    Iterator<String> it = myList.iterator(); 
    while(it.hasNext()){ 
     String value = it.next(); 
     System.out.println("List Value:"+value); 
     if(value.equals("3")){ 
      myList.remove("4"); 
      myList.add("6"); 
      myList.add("7"); 
     } 
    } 
    System.out.println("List Size:"+myList.size());