使用迭代器从列表中删除条目

时间:2012-01-17 09:12:17

标签: java list arraylist

我需要编写一个简单的函数来删除List中包含类Elem对象的所有条目。我编写了函数removeAllElements,但如果List<Elem>的大小大于1,它就不起作用。

public class Test {

public static void main(String[] args) {
        Work w = new Work();
        w.addElement(new Elem("a",new Integer[]{1,2,3}));
        w.addElement(new Elem("b",new Integer[]{4,5,6}));

        w.removeAllElements(); // It does not work for me.
    }
}    

public class Work {

    private List<Elem> elements = new ArrayList<Elem>();

    public void addElement(Elem e) {
        this.elements.add(e);
    }

    public void removeAllElements() {
        Iterator itr = this.elements.iterator(); 
        while(itr.hasNext()) {
            Object e = itr.next();
            this.elements.remove(e);
        }
    }

}

public class Elem {

    private String title;
    private Integer[] values;

    public Elem(String t,Integer v) {
        this.title = t;
        this.values = v;
    }

}

修改#1 错误消息如下:

Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
    at java.util.AbstractList$Itr.next(Unknown Source)

4 个答案:

答案 0 :(得分:11)

代码无法编译。什么是this.tokens

无论如何,如果你想在迭代时删除一个元素,你必须使用迭代器的remove方法来做它:

itr.next();
itr.remove();

但是,removeAllElements方法只能this.elements.clear()。更直接,更有效率。

答案 1 :(得分:6)

在迭代时删除元素时,您必须使用itr.remove()而不是this.tokens.remove(e)

有关详细信息,请查看Iterator.remove()

答案 2 :(得分:2)

我假设tokens是你的Arraylist?

从数组列表中动态删除元素时,需要使用迭代器提供的.remove方法。所以你需要做这样的事情:

public void removeAllElements() {
        Iterator itr = this.elements.iterator(); 
        while(itr.hasNext()) {
            Object e = itr.next();
            itr.remove();
        }
    }

如果您只想删除列表中的所有元素,可以调用Arraylist的.clear方法:

  

从此列表中删除所有元素。该列表将为空   在此呼叫返回后。

答案 3 :(得分:1)