首页 > 解决方案 > 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 脚本。

标签: groovyjira

解决方案


问题是您正在将元素添加到您正在迭代的同一个集合中。在许多情况下,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]

推荐阅读