gpt4 book ai didi

Java - 具有递归方法和嵌套迭代器的 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-12-02 12:11:52 28 4
gpt4 key购买 nike

我有一个作业要编写一个 Java 程序,该程序将读取上下文无关语法并返回所有非终结符的 FirstSet。我使用 FirstSet() 方法采用了递归方法:

public static ArrayList<String> firstSet(String nonTerminal){
ArrayList<String> first = new ArrayList<String>();
//Find initial elements of FirstSet
for(String[] current : prodRules) {
if (current[0].equals(nonTerminal)){ //if the production rule is for that non-terminal
if(current.length > 2) {
first.add(current[2]); //first element after "-->" is added to FirstSet
} else
first.add("eps");
}
}
//Add the FirstSet of each element in the initial FirstSet
ArrayList<String> copy = first; //to avoid ConcurrentModificationException
Iterator<String> it1 = copy.iterator();
while(it1.hasNext()) { //recursively find each FirstSet of the initial elements
String s = it1.next();
System.out.println("FIRST("+s+")={");
ArrayList<String> nestedFS = firstSet(s);
Iterator<String> it2 = nestedFS.iterator();
while(it2.hasNext()) {
String f = it2.next();
if(!first.contains(f))
first.add(f);
System.out.print(" "+f+" ");
}
System.out.print("}");
}
return first;
}

但是,我不断收到以下行的 ConcurrentModificationException 错误:

String s = it1.next();

ArrayList<String> nestedFS = firstSet(s);

据我所知,我没有修改当前正在迭代的任何列表。相反,我正在迭代副本。我不关心冗余内存使用或速度,我只需要它能够工作。

关于我在这里做错了什么有任何线索吗?非常感谢任何帮助。

最佳答案

首先使用 CopyOnWriteArrayList 创建 ArrayList 的副本,这样可以避免 ConcurrentModificationException。

    ArrayList<String> copy = first; //replace this line with 
CopyOnWriteArrayList<String> copy= new CopyOnWriteArrayList<String>(first);

ArrayList不是线程安全的,需要实现线程安全,我们可以使用线程安全的CopyOnWriteArrayList。

关于Java - 具有递归方法和嵌套迭代器的 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46480182/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com