Расширяющийся массив внутри Для L oop условие не повторяется до конца массива - PullRequest
1 голос
/ 10 января 2020

Вот приблизительное, но рабочее приближение моего кода

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]

l oop должен был бы повторить 5 раз, но это нет, почему это? В p добавлено 5, и журнал показывает это, что означает, что массив расширяется, но l oop работает только 4 раза, что соответствует размеру исходного массива.

То же самое происходит в моем реальном коде, где я ищу элементы массива, используя for (i in p), чтобы найти родительские значения i (папка в структуре каталогов), а затем добавляю эти результаты в p, чтобы я мог продолжать подниматься по структуре каталогов до тех пор, пока не останется родителей

Среда: Groovy скрипт, запущенный в Jira через Script Runner.

1 Ответ

0 голосов
/ 10 января 2020

Проблема заключается в том, что вы добавляете элементы в ту же коллекцию, над которой выполняете итерацию. Во многих случаях 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...