在groovy中创建一个新的动态命名列表

时间:2015-05-21 14:30:05

标签: list variables dynamic groovy

我有一个类似于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"]

是否可以像这样做一个动态命名的变量?

4 个答案:

答案 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的事实,这是另一种基于eachfindAll闭包的方法:

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循环了。