groovy - For Loop 条件中的扩展数组直到数组末尾才被迭代
问题描述
这是我的代码的粗略但有效的近似值
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 次,这是原始数组的大小。
同样的事情发生在我的实际代码中,我正在使用 a 搜索数组的项目for (i in p)
以查找 i 的父值(目录结构中的文件夹),然后将这些结果添加到 p 以便我可以继续向上目录结构直到没有更多的父母被发现。
环境:通过 Script Runner 在 Jira 中运行的 Groovy 脚本。
解决方案
问题是您正在将元素添加到您正在迭代的同一个集合中。在许多情况下,Groovy 实际上会ConcurrentModificationException
在运行时为您提供一个。为了解决这个问题,您可以使用索引而不是迭代器进行迭代。我从这个网站得到的信息
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]
推荐阅读
- node.js - MEAN Stack:未提供代币
- php - Vue 资源空数据
- c# - 如何使用键将列表转换为字典但不包含键作为元素
- angular - Angular 6 从 IntelliJ 运行业力测试
- parameter-passing - 日期参数打开查询 SQL - 错误:字符串后的未闭合引号
- ios - 使用变量作为 arc4random 的下限 - 显式类型/可跨步?
- javascript - 如何在没有第二个参数的情况下使用 insertBefore()?
- php - 在php中向我的数据库发送请求
- sequelize.js - Sequelize 不将修改日期返回为 UTC
- reactjs - 部署在不同位置(子目录)的 React-router 应用程序