- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从给定的边和根构造二叉树。我迭代所有行并将左子节点设置为给定节点(如果找到给定节点的第二次出现,则设置右子节点)。当设置子节点时,我从 ArrayList 中删除该元素并在子节点上递归调用函数。
List<Integer[]> edges = new ArrayList<>();
这个数组列表例如:
3 4
3 0
4 5
1 3
2 4
根目录是1
。我有类节点
public class Node {
public Node left;
public Node right;
public int key;
public Node(int k) {
key = k;
left = null;
right = null;
}
...}
我构建树的函数是:
public static void edgeToNodes(Node root) {
if (root == null) return;
int count = 0;
for (Iterator<Integer[]> iterator = edges.iterator(); iterator.hasNext(); ) {
Integer[] edge = iterator.next();
for (int i = 0; i < edge.length; i++) {
if (edge[i] == root.key) {
if (count == 0) {
Node left;
if (i == 0) {
left = new Node(edge[1]);
root.setLeft(left);
} else {
left = new Node(edge[0]);
root.setLeft(left);
}
iterator.remove();
count++;
edgeToNodes(left);
} else {
Node right;
if (i == 0) {
right = new Node(edge[1]);
root.setRight(right);
} else {
right = new Node(edge[0]);
root.setRight(right);
}
iterator.remove();
edgeToNodes(right);
}
}
}
}
}
问题是它在 Integer[] edge = iterator.next();
和 edgeToNodes(left); 行上给了我
如何避免此异常?java.util.ConcurrentModificationException
。
最佳答案
您在迭代列表时从列表中删除元素。
如果您仅通过一个迭代器来完成它,它就会起作用。问题是您使用递归,因此创建了多个修改同一列表的迭代器。这会导致 ConcurrentModificationException
。
您可以以更加迭代的方式构建节点。
pendingNodes
)。pendingNodes
的第一个元素。pendingNodes
列表中。这是代码示例:
public class Problem {
private List<Integer[]> edges;
private LinkedList<Node> pendingNodes = new LinkedList<>();
private Map<Integer, Node> nodeMap = new HashMap<>();
private Set<Integer> visitedNodes = new HashSet<>();
public Problem(List<Integer[]> edges) {
this.edges = edges;
}
public void run(Integer root) {
//Initialization
Node rootNode = new Node(root);
this.pendingNodes.add(rootNode);
this.nodeMap.put(root, rootNode);
while(!pendingNodes.isEmpty()) {
Node parent = pendingNodes.poll();
for (Integer[] edge : edges) {
if(edge[0].equals(parent.getKey())) {
link(parent, edge[1]);
} else if (edge[1].equals(parent.getKey())) {
link(parent, edge[0]);
}
}
visitedNodes.add(parent.getKey());
}
}
public void link(Node parent, Integer child) {
if(!visitedNodes.contains(child)) {
//get the corresponding node, create it if not exists
Node childNode = nodeMap.get(child);
if (childNode == null) {
childNode = new Node(child);
nodeMap.put(child, childNode);
pendingNodes.add(childNode);
}
//Choose between left and right...
if (parent.getLeft() == null) {
parent.setLeft(childNode);
} else {
parent.setRight(childNode);
}
}
}
public static void main(String[] args) {
//Build the input dataset
List<Integer[]> edges = Arrays.asList(
new Integer[]{3, 4},
new Integer[]{3, 0},
new Integer[]{4, 5},
new Integer[]{1, 3},
new Integer[]{2, 4}
);
Problem problem = new Problem(edges);
problem.run(1);
Map<Integer, Node> nodeMap = problem.nodeMap;
for (Node node : nodeMap.values()) {
System.out.println(node);
}
}
}
输出(我自定义了Node#toString()
):
0 => {null, null}
1 => {3, null}
2 => {null, null}
3 => {4, 0}
4 => {5, 2}
5 => {null, null}
关于java - 使用 ArrayList 和递归避免 java.util.ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36062194/
这个问题在这里已经有了答案: Why is a ConcurrentModificationException thrown and how to debug it (8 个答案) 关闭 3 年前。
这个问题已经有答案了: Concurrent Modification exception [duplicate] (9 个回答) 已关闭 8 年前。 在oldSet.removeAll(已删除);抛
这个问题在这里已经有了答案: Concurrent Modification exception [duplicate] (9 个回答) 关闭 9 年前。 我的程序抛出 ConcurrentModi
我有以下结构: public class Object1{ private HashMap myMap; ... public void cancelItem(Item o)
在本例中使用 list.remove((Object)93) 会导致 ConcurrentModificationException: List list = new ArrayList<>(); l
更新应用程序后,我收到来自 Firebase 的错误几乎在所有 Activity 中。 Fatal Exception: java.lang.RuntimeException: Unable to s
我有大量的东西,一个重复迭代它们的线程,以及一个偶尔删除或添加单个东西的单独线程。事物在同步链表中: private List things = Collections.synchronizedLis
在 DTO 中我有 public class ProductTypesDto extends BaseDto { private List colors = new ArrayList<>();
我正在创建一个 Swing 应用程序来制作游戏。它在屏幕外的随机位置创建图像,当它们离开屏幕时我想将它们删除。请看一下代码片段: public void checkTrolls(){ //CAUSES
我在向 Android 表插入数据时遇到问题。这是我的 Dao 函数: @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(frei
我有一个 Grails (2.4.3) 应用程序,它使用 PersistenceListener 来监听 GORM 事件。 PersistenceListener 工作正常。在 PreUpdate 事
基于 Spring Boot、spring-data-jpa 的大型 REST Web 应用程序。我有 PersonEntity ,它与 ParentEntity 具有 ManyToOne 关系。关系
我有一个作业要编写一个 Java 程序,该程序将读取上下文无关语法并返回所有非终结符的 FirstSet。我使用 FirstSet() 方法采用了递归方法: public static ArrayLi
我收到java.util.ConcurrentModificationException,但我不知道为什么。 在 Logcat 中,它指向此代码,但我没有看到任何可能导致 ConcurrentModi
我在以下情况下收到 ConcurrentModificationException 错误。线路发生这种情况的地方标有“ list = Collections.synchronizedList(them
自过去两个小时以来,我一直在尝试解决此异常..我得到了抛出异常的代码行..但没有找到解决方案..请帮助我发生错误@ mUsers.add(user);//在其他部分 private void read
我有以下代码: List list = getItems(); //where getItems() returns List do { list.add(ad
我得到ConcurrentModificationException当迭代 map 的内容时 for (String sourceKey : sMap.getContent().keySet(
代码是葡萄牙语的,对此我很抱歉。 我在这里读到另一个问题,因为我正在使用progSelecionada.remove(),所以抛出了异常,所以我更改为iterator.remove()但错误仍然存
我目前正在用 Java 编写多人游戏。我当前的代码(即出现错误)是这样的。 @Override public void onClose(WebSocket conn, int code, String
我是一名优秀的程序员,十分优秀!