Groovy 为循环条件isn扩展内部数组';直到数组结束时才进行迭代

Groovy 为循环条件isn扩展内部数组';直到数组结束时才进行迭代,groovy,jira,Groovy,Jira,这是我的代码的一个粗略但有效的近似值 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

这是我的代码的一个粗略但有效的近似值

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)
循环应该在5上迭代一次,但它没有,为什么
p
添加了5次,日志显示这意味着阵列正在扩展,但循环只运行了4次,这是原始阵列的大小

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

环境:
通过scriptrunner在Jira中运行的Groovy脚本。

问题是您正在向迭代的同一个集合添加元素。在许多情况下,Groovy实际上会在运行时为您提供一个
ConcurrentModificationException
。要解决这个问题,可以使用索引而不是迭代器进行迭代。我从你那里得到的信息


问题是您正在向迭代的同一个集合添加元素。在许多情况下,Groovy实际上会在运行时为您提供一个
ConcurrentModificationException
。要解决这个问题,可以使用索引而不是迭代器进行迭代。我从你那里得到的信息


您不应该同时查找和更新我不知道您的目标,但根据您的算法-您正在为数组中的每个
非5
元素添加元素
5
,除非您满足
5
。您不应该同时查找和更新我不知道您的目标,但根据您的算法,您正在为数组中的每个
非5
元素添加元素
5
,除非您遇到
5
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]
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]