【问题标题】:Create a new dynamically named list in groovy在 groovy 中创建一个新的动态命名列表
【发布时间】:2015-05-21 14:30:04
【问题描述】:

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

是否可以像这样动态命名变量?

【问题讨论】:

  • 你试过Map 吗?例如。 stackoverflow.com/questions/12236743/…
  • 我查看了使用地图,并对其进行了更多研究,它可能在未来很有用。我一直在假设我可以做一个动态命名的变量,因为我可以在 java 中做到这一点,所以它是我代码的最后一部分。我不需要做太多改变来做地图,所以如果我需要增加功能,我会研究一下!

标签: list variables dynamic groovy


【解决方案1】:

您可以动态添加变量,但您需要使用this(作为您设置变量的对象的实例),例如:

this."${items[i]}" += value[i]

这应该可以满足您的需求,或者至少可以为您指明正确的方向。

【讨论】:

    【解决方案2】:

    据我所知,代码应该是这样的:

    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"]
    

    【讨论】:

      【解决方案3】:

      如果您接受输出将是 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]]
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-21
          • 1970-01-01
          • 1970-01-01
          • 2014-07-31
          • 1970-01-01
          • 1970-01-01
          • 2012-11-14
          • 1970-01-01
          相关资源
          最近更新 更多