【问题标题】:Getting ConcurrentModificationException when adding/removing from queue从队列中添加/删除时获取 ConcurrentModificationException
【发布时间】:2022-01-18 19:01:52
【问题描述】:

我在下面需要使用队列的地方创建了算法的一部分,但在 Java 中,我无法在迭代队列时修改队列。我收到了ConcurrentModificationException。

对此我能做些什么?我已经考虑了好几个小时了。

m, n = len(mat), len(mat[0])
visited = [[False] * n for row in range(m)]
q = deque()
destinations = set()

def should_visit(row, col):
    """Return true if (row,col) is a valid position not processed yet"""
    return 0 <= row < m and 0 <= col < n and \
           mat[row][col] != 'o' and not visited[row][col]

for r in range(m):
    for c in range(n):
        if mat[r][c] == 'r':
            q.append((r, c))
            visited[r][c] = True
        elif mat[r][c] == 'b':
            destinations.add((r, c))

dist = 1  # the level in breadth-first-search.
while q:
    for _ in range(len(q)):
        (r, c) = q.popleft()

        for (new_r, new_c) in ((r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)):
            if should_visit(new_r, new_c):
                if (new_r, new_c) in destinations:
                    return dist
                q.append((new_r, new_c))
                visited[new_r][new_c] = True
    dist += 1

【问题讨论】:

  • @BenAnderson 但是如何使用这种方法将Last 和 removeFirst 添加到队列中?
  • @user17405569 考虑使用迭代器吗?
  • @rzwitserloot 我被告知我的代码给出了这个错误。
  • @BenAnderson 但是如何使用迭代器“removeFirst”和“addLast”?

标签: java queue


【解决方案1】:

你得到这个异常是因为你使用 foreach 循环队列。 foreach 的内部迭代器会抱怨queue.removeFirst() 调用。

使用while (!queue.isEmpty()) { var cell = queue.removeFirst(); 就可以了。我不相信 foreach 循环甚至应该在那里。

【讨论】:

  • 删除 for-each 循环会完全改变代码的输出,我不知道为什么。
  • 我敢肯定,因为现在你错过了一个循环。如果您需要该循环,只需将队列复制到一个新队列中并在其上进行 foreach 循环。我无法详细说明您的代码输出应该是什么,什么不是。此外,您不应编辑您的帖子以反映您的代码更改,这会使每个人都难以理解任何答案。
  • 那你说的`不相信foreach循环应该存在`是什么意思?
  • 意思是,乍一看,用两个循环遍历同一个队列是没有意义的。我不知道您是否同时需要它们,其中一个显然是您的异常的来源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 2021-12-15
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 2012-12-17
相关资源
最近更新 更多