Последнее значение в списке заменяет все остальные значения при настройке внутри циклов в Groovy

#groovy

#groovy

Вопрос:

ОТРЕДАКТИРОВАННЫЙ ВОПРОС:

 def responseTemp = [] 
def response = [:]
   loop1.each { row1 -> 
   loop2.each (row2 -> 
   loop3.each {row3 -> 
   loop4.each {row4 -> 
      response << ['field1' : 'row1.value1'] 
      response << ['field2' : 'row2.value1'] 
      response << ['field3' : 'row3.value1'] 
      responseTemp.add(response) 
      } 
     } 
    }  
   } 
println (responseTemp)
 

Ожидаемый результат — я должен получить весь ответ (мой выполняется 10 раз), поэтому должен увидеть все 10 ответов в responseTemp. Но что я вижу, если только 10-й ответ 10 раз в responseTemp.

Как я могу добавить весь ответ в responseTemp по мере выполнения итерации и вернуть его в конце.

Комментарии:

1. Почему вы повторно используете имена своих списков в качестве переменных закрытия? Кроме того, response << ['key' : "value"] в итоге будет только одно значение response , даже если вы запустите его миллион раз.

2. Я в основном пытаюсь сохранить весь ответ в списке и передать его позже, как только цикл будет завершен

3. Но при попытке сделать это все, что я вижу, это только последний ответ, повторяющий no . раз, когда цикл выполнялся

4. @ernest_k: Есть ли способ сохранить все эти ответы в другой список, чтобы я не терял их во время цикла? И которое я могу использовать после завершения цикла

5. Вы, скорее всего, теряете их, потому что добавляете их в одну и ту же map ( response ) снова и снова — и все же совершенно непонятно, что вам нужно — этот пример кода настолько абстрагирован от реальной проблемы, что его трудно понять (по крайней мере, для меня). Не могли бы вы, пожалуйста, предоставить минимальный жизнеспособный пример (определите list [123] с несколькими фиктивными значениями, не добавляйте всегда одно и то же [key: "value"] на карту, а что-то реальное, и, наконец, укажите, какой результат вы ожидаете получить от входных данных.

Ответ №1:

Поскольку вы удерживаете свою карту, чтобы добавить к результатам по всем элементам вашего декартова произведения, вы всегда будете добавлять одну и ту же карту к результату. И поскольку вы переопределяете всегда одни и те же ключи, карта будет содержать элементы последней итерации.

Простое решение: переместите def response в самое внутреннее each/ closure.

Тем не менее, вы также можете просто вообще не использовать переменную и вместо нее использовать литерал карты. Например.

 def responseTemp = [] 
[1,2].each{ row1 -> 
    [3,4].each{ row2 -> 
        responseTemp.add([field1: row1, field2: row2])
    }  
} 
println (responseTemp)
// → [[field1:1, field2:3], [field1:1, field2:4], [field1:2, field2:3], [field1:2, field2:4]]
 

Если вы предпочитаете более декларативный способ, вы также можете использовать collectMany во
внешних циклах и, наконец collect , во внутренних. Например.

 def responseTemp = [1,2].collectMany{ row1 -> 
    [3,4].collectMany{ row2 -> 
        [5,6].collect{ row3 -> 
            [field1: row1, field2: row2, field3: row3]
        }  
    }  
} 
println (responseTemp)
// → [[field1:1, field2:3, field3:5], [field1:1, field2:3, field3:6], [field1:1, field2:4, field3:5], [field1:1, field2:4, field3:6], [field1:2, field2:3, field3:5], [field1:2, field2:3, field3:6], [field1:2, field2:4, field3:5], [field1:2, field2:4, field3:6]]
 

Комментарии:

1. Это сработало как шарм. Большое спасибо @cfrick