【问题标题】:The last value in list is replacing all other values while setting within loops in Groovy列表中的最后一个值是在 Groovy 的循环中设置时替换所有其他值
【发布时间】:2021-03-27 08:10:38
【问题描述】:

编辑问题:

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 次)所以应该在 responseTemp 中看到所有 10 个响应。但我看到的是,如果在 responseTemp 中只有第 10 次响​​应 10 次。

当我们迭代并最终返回时,如何将所有响应添加到 responseTemp 中。

【问题讨论】:

  • 为什么要重用列表的名称作为闭包变量?除此之外,response &lt;&lt; ['key' : "value"] 最终会在response 中得到一个值,即使你运行它一百万次。
  • 我基本上是在尝试将所有响应保存在一个列表中,并在循环完成后传递它
  • 但在尝试这样做时,我看到的只是最后一个响应重复了 no 。循环运行的次数
  • @ernest_k :有没有办法可以将所有这些响应保存到另一个列表中,这样我就不会在循环时丢失它们?我可以在循环结束后使用它
  • 您很可能会丢失它们,因为您一遍又一遍地将它们添加到同一个地图 (response) - 但完全不清楚您要追求什么 - 此代码示例到目前为止从真正的问题中抽象出来,很难理解(至少对我来说)。您能否提供一个最小的可行示例(使用一些虚拟值定义 list[123],不要总是将相同的 [key: "value"] 添加到地图中,而是添加一些真实的东西,最后说明您期望输入的结果是什么.

标签: groovy


【解决方案1】:

由于您坚持使用地图添加到所有项目的结果中 您的笛卡尔积,您将始终将相同的地图添加到结果中。 而且由于您始终覆盖相同的键,因此地图将包含 上次迭代的项目。

简单的解决方案:将def response 移到最里面 每个/关闭。

但是,您也可以根本不使用变量而使用映射文字。例如

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 on 外部循环,最后是最里面的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]]

【讨论】:

  • 这就像一个魅力。非常感谢@cfrick
猜你喜欢
  • 1970-01-01
  • 2016-09-12
  • 2014-06-25
  • 2018-03-30
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 2016-02-20
  • 2021-05-29
相关资源
最近更新 更多