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

3

我需要编写一个简单的函数,用于删除包含类Elem对象的所有条目的List。我编写了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个回答

11

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

无论如何,如果您想在迭代时删除一个元素,必须使用迭代器的remove方法进行操作:

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

你的removeAllElements方法可以直接使用this.elements.clear()实现,更加直接和高效。


6

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

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


然后它说:AWT-EventQueue-0 异常线程中的 java.lang.IllegalStateException 在 java.util.AbstractList$Itr.remove(Unknown Source) 在 cpn_logic.Work.removeAllElements(Work.java:119) - Klausos Klausos
2
@KlausosKlausos:你需要在使用了next()之后才使用remove(),正如我链接的Javadocs清楚地指出的那样。 - amit
1
不仅仅是“应该”,你必须 - Viruzzo
哦,我必须使用 itr.next() 和 itr.remove()。 - Klausos Klausos

2
我假设 tokens 是你的 ArrayList?
当动态地从一个数组列表中移除元素时,你需要使用迭代器提供的 .remove 方法。所以你需要像这样做:
public void removeAllElements() {
        Iterator itr = this.elements.iterator(); 
        while(itr.hasNext()) {
            Object e = itr.next();
            itr.remove();
        }
    }

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

从列表中删除所有元素。此调用返回后,列表将为空。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接