直到数组末尾才迭代 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]
这是我的代码的粗略但可行的近似值
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]