我有一个类似于items = ["a", "b", "c"]
我还有一个类似于values = ["a1", "a2", "a3", "b1", "b2", "c1", "c2", "c3"]
我的items
列表是静态的,但我的values
列表会经常更改。
我的代码看起来像这样
for(z=0;z<items.size();z++){
for(i=0;i<values.size();i++){
if(values[i] =~ items[z]){
println value[i]
}
}
我真正想要做的是将value[i]
添加到名称为items[z]
的列表中,其功能类似于${"items[i]"} += value[i]
,代码会将其读作a += value[1]
,b += value[1]
等等通过我的循环,所以最后我可以做这样的事情
assert a == ["a1", "a2", "a3"]
assert b == ["b1", "b2"]
assert c == ["c1", "c2", "c3"]
是否可以像这样做一个动态命名的变量?
答案 0 :(得分:2)
您可以动态添加变量,但您需要使用this
(作为您设置变量的对象的实例),例如:
this."${items[i]}" += value[i]
这应该可以满足您的需求,或者至少为您指明正确的方向。
答案 1 :(得分:1)
至于我的不受欢迎和代码应该是这样的:
def map = [:]
for(z=0;z<items.size();z++){
for(i=0;i<values.size();i++){
if(values[i] =~ items[z]){
if (map[values[i]] == null) {
map[values[i]] = []
}
map[values[i]].add(items[z])
}
}
}
assert map[values[0]] == ["a1", "a2", "a3"]
assert map[values[1]] == ["b1", "b2"]
assert map[values[2]] == ["c1", "c2", "c3"]
答案 2 :(得分:0)
如果你接受输出是Map的事实,这是另一种基于each
和findAll
闭包的方法:
def items = ["a", "b", "c"]
def values = ["a1", "a2", "a3", "b1", "b2", "c1", "c2", "c3"]
def result = [:]
items.each{i->
result.put(i, values.findAll{v->v.startsWith(i)})
}
println result; //[a:[a1, a2, a3], b:[b1, b2], c:[c1, c2, c3]]
答案 3 :(得分:0)
groupBy
是你的朋友:
def groups = values.groupBy { v ->
items.find { i -> v =~ i }
}
assert groups.a == ['a1', 'a2', 'a3']
assert groups.b == ['b1', 'b2']
assert groups.c == ['c1', 'c2', 'c3']
作为旁注,我强烈建议你仔细阅读Groovy's excellent List/Map comprehension;我可以保证,一旦你明白了,你就不再需要在你的代码中使用for循环了。