迭代链表

时间:2011-05-16 13:40:13

标签: java

我正在开发一个包含遗留代码的应用程序。这里有一个链表,代码在while循环中使用迭代器迭代该链表。

        LinkedList ll = grammarSection.getSectionsAsLinkList();
        Iterator iter = ll.iterator();
        int i=0;
        while (iter.hasNext()) {
          1.  GrammarSection agrammarSection = (GrammarSection) iter.next();
          2.  grammarLineWithMatches = m_grammarLineMatcher.getMatch(agrammarSection, p_line);
          3.  if (grammarLineWithMatches != null) { //condition a             
          4.     if (getPeek(ll)!=agrammarSection)
          5.        ll.addFirst(ll.remove(i)); //changing the linkedlist  Line5
                return grammarLineWithMatches;
            }
            i++;
        }

在while循环中,如果条件a为真,则链接列表将按照第5行进行修改。但是,在这种情况下,line1上的下一个方法会抛出ConcurrentModificationException。如何在不获取任何ConcurrentModificationException的情况下添加和删除链接列表

3 个答案:

答案 0 :(得分:2)

您无法更改当前正在迭代的集合。你可以:

  • 创建它的副本并重复复制
  • 不要使用迭代器 - 从0循环到list.size()。但是使用LinkedList这效率不高。

如果只是关于移除,您可以使用iter.remove(),但您也有addFirst(..)

答案 1 :(得分:1)

简短的回答是:你做不到。

JDK的List实现被设计为由迭代器修改,以保持迭代的顺序(没有办法判断任意列表更改是否会这样做,因此迭代器假设最坏)。

在您的情况下,解决方案是创建一个新的LinkedList。在迭代时,要么将迭代元素添加到新列表的结尾或开头。然后扔掉旧的。

答案 2 :(得分:1)

迭代器是故障快速迭代器,所以它可能会抛出ConcurrentModificationException。

最简单的解决方案是;

而不是在迭代时从列表中删除项目,将要删除的项目添加到新列表中,在循环之后,您可以使用removeAll列表方法删除所有这些项目。

反之亦然,保留您需要保留的内容并将新列表分配给旧列表