直到数组末尾才迭代 For Loop 条件中的扩展数组

Expanding array inside For Loop conditional isn't being iterated on until the end of the array

这是我的代码的粗略但可行的近似值

ArrayList<Integer> parents = new ArrayList<Integer>([1, 2, 8, 9])

def p = parents as Queue

p.find {
    log.info("it is " + it)
    if (it == 5) return true
    p += 5
    log.info("p is " + p)
    return false
}

log.info("finally, p is " + p)

这是日志

2020-01-09 16:35:55,971 INFO [runner.AbstractScriptRunner]: it is 1
2020-01-09 16:35:55,971 INFO [runner.AbstractScriptRunner]: p is [1, 2, 8, 9, 5]
2020-01-09 16:35:55,971 INFO [runner.AbstractScriptRunner]: it is 2
2020-01-09 16:35:55,972 INFO [runner.AbstractScriptRunner]: p is [1, 2, 8, 9, 5, 5]
2020-01-09 16:35:55,972 INFO [runner.AbstractScriptRunner]: it is 8
2020-01-09 16:35:55,972 INFO [runner.AbstractScriptRunner]: p is [1, 2, 8, 9, 5, 5, 5]
2020-01-09 16:35:55,972 INFO [runner.AbstractScriptRunner]: it is 9
2020-01-09 16:35:55,972 INFO [runner.AbstractScriptRunner]: p is [1, 2, 8, 9, 5, 5, 5, 5]
2020-01-09 16:35:55,972 INFO [runner.AbstractScriptRunner]: finally, p is [1, 2, 8, 9, 5, 5, 5, 5]

循环应该在 5 上迭代一次,但没有,这是为什么? p 添加了 5,日志显示了这一点,这意味着数组正在扩展,但循环只运行了 4 次,这是原始数组的大小。

我的实际代码中也发生了同样的事情,我使用 for (i in p) 搜索数组的项目以找到我的父值(目录结构中的文件夹),然后将这些结果添加到 p 这样我就可以继续向上目录结构,直到找不到更多父级。

环境: Groovy 通过 Script Runner 在 Jira 中编写脚本 运行。

问题是您将元素添加到正在迭代的同一集合中。在许多情况下 Groovy 实际上会在运行时给你一个 ConcurrentModificationException。要解决此问题,您可以使用索引而不是迭代器进行迭代。我从 this site

获得的信息
ArrayList<Integer> parents = new ArrayList<Integer>([1, 2, 8, 9])

def p = parents as Queue

for(int i=0; i<p.size(); i++) {
    log.info("it is " + p[i])
    if (p[i] == 5) break
    p += 5
    log.info("p is " + p)
}

log.info("finally, p is " + p)

产生以下输出:

2020-01-10 11:35:05,468 DEBUG [runner.WithPluginCompilationCustomiser]: Compile Script2754.groovy, to node: Script2754
2020-01-10 11:35:06,414 INFO [runner.AbstractScriptRunner]: it is 1
2020-01-10 11:35:06,414 INFO [runner.AbstractScriptRunner]: p is [1, 2, 8, 9, 5]
2020-01-10 11:35:06,414 INFO [runner.AbstractScriptRunner]: it is 2
2020-01-10 11:35:06,414 INFO [runner.AbstractScriptRunner]: p is [1, 2, 8, 9, 5, 5]
2020-01-10 11:35:06,414 INFO [runner.AbstractScriptRunner]: it is 8
2020-01-10 11:35:06,414 INFO [runner.AbstractScriptRunner]: p is [1, 2, 8, 9, 5, 5, 5]
2020-01-10 11:35:06,414 INFO [runner.AbstractScriptRunner]: it is 9
2020-01-10 11:35:06,414 INFO [runner.AbstractScriptRunner]: p is [1, 2, 8, 9, 5, 5, 5, 5]
2020-01-10 11:35:06,414 INFO [runner.AbstractScriptRunner]: it is 5
2020-01-10 11:35:06,414 INFO [runner.AbstractScriptRunner]: finally, p is [1, 2, 8, 9, 5, 5, 5, 5]