剥离代码以突出显示演示行为的主要组件:
def template = [type: 'a', directories: [['dir': 'a/b/c']]]
def ids = [1,2,3]
def allPhases = []
ids.each { id ->
def phase = [:]
template.keySet().each { phase.put(it, template.get(it)) }
phase.id = id
phase.directories[0].put('command', "apply/${id}")
allPhases.add(phase)
}
println(allPhases)
字符串
输出量:
[
[type:a, directories:[[dir:a/b/c, command:apply/3]], id:1],
[type:a, directories:[[dir:a/b/c, command:apply/3]], id:2],
[type:a, directories:[[dir:a/b/c, command:apply/3]], id:3]
]
型
我有一个模板和一个我要迭代的值列表。(未显示)向map中的键添加元素。我看到在每次迭代中,map中的键id
都被正确设置,但向现有的map列表添加键会导致问题-它只使用ids
的最后一个值(例如3
)。
为什么某些键会发生这种情况,而其他键却没有?Map列表的更新需要以不同的方式完成吗?
2条答案
按热度按时间yzuktlbb1#
你总是在写同一个数组,因为你的map的“副本”只复制了map的 * 结构 *,而没有复制它的内容。
directories
的 * 值 * 不是 * 复制的 *,而是 * 引用的 *。看看其中一个答案,如何做一个深复制,并找到一种你喜欢的方式(或只是解决问题的
directories
你自己。例如Deep Copy字符串
1cklez4t2#
下面这一行:
字符串
重写Map到名为
command
的键的值。因此,在迭代1
,2
和3
之后,每次只保留最后一个值。只是为了检查,让我们通过将其更改为以下内容来使每次迭代的键唯一:型
然后输出将是这样的:
型