2013-04-26 49 views
2

我想要顯示字符列表中出現的數字,然後刪除該數字。這裏是我的代碼:使用java刪除字符列表中的數字

package mytrials;

import java.util.ArrayList; 
import java.util.ListIterator; 

public class MyTrials { 
    public static void main(String[] args) { 
    ArrayList<Character> list = new ArrayList<Character>(); 
    list.add('a'); 
    list.add('1'); 
    list.add('5'); 
    System.out.println(list.size()); 
    for(ListIterator i = list.listIterator(list.size()); i.hasPrevious();){ 
     Character c = (Character) i.previous(); 
     if(Character.isDigit(c)){ 
      System.out.println(c + " is a digit"); 
      list.remove(c); 
     } 
    } 
    System.out.println(list.size()); 
} 
} 

以下是錯誤消息:

3 
5 is a digit 
Exception in thread "main" java.util.ConcurrentModificationException 
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372) 
at java.util.AbstractList$ListItr.previous(AbstractList.java:386) 
at mytrials.MyTrials.main(MyTrials.java:27) 
Java Result: 1 

這是什麼錯誤的原因,以及它如何可以得到糾正。

+2

,這就是爲什麼你得到一個ConcurrentModificationException的 – Satya 2013-04-26 13:13:51

回答

8

嘗試

i.remove(); 

,而不是

list.remove(c); 

See here

注意Iterator.remove是在迭代修改集合的唯一安全的方法;如果在迭代過程中以任何其他方式修改了基礎集合,則行爲是未指定的。

使用iterator而不是換每個(循環),當你需要構建:

  • 刪除當前元素。 for-each構造隱藏了迭代器,因此您不能調用remove。因此,for-each構造不適用於過濾。

  • 並行迭代多個集合。

+0

這確實是問題,+1。我想知道這個答案存在多少個問題。 :) – Magnilex 2013-04-26 13:14:58

+2

解釋將是一個很好的補充。 – Keppil 2013-04-26 13:15:33

+0

@Keppil我編輯了我的答案。現在好嗎? – 2013-04-26 13:25:35

2

嘗試與你的迭代器刪除:

i.remove(); // instead of list.remove(c); 
0

錯誤的原因是迭代器的列表是通過使用list.remove(c);。當列表被直接修改修改,迭代器變爲無效,從而導致你的錯誤。

由於Achintya傑哈發佈的,你應該使用迭代器的remove功能

0

列表迭代器是快速失敗的迭代器,並拋出時,線程試圖同時另一個線程遍歷它來修改列表內容異常。

This might help and this one

你正在使用的ListIterator,這不是故障安全的迭代器