【问题标题】:How to iterator over an array in Groovy?如何在 Groovy 中迭代数组?
【发布时间】:2011-06-01 10:51:12
【问题描述】:
public class ArrayTest{
  public static void main(String[] args){
    String[] list = {"key1", "key2", "key3"};
    String[] list2 = {"val1", "val2", "val3"};

    for(int i = 0; i < list.length; i++){
      ilike(list[i], list2[i];        
    }
  }
}

如何在 Groovy 中编写上述代码?

实际上,它是一个 grails 应用程序,我想在上面做类似的事情。

【问题讨论】:

    标签: arrays grails groovy iteration


    【解决方案1】:

    您想到了几个选项...

    给定:

    String[] list  = [ 'key1', 'key2', 'key3' ]
    String[] list2 = [ 'val1', 'val2', 'val3' ]
    

    那么你可以这样做:

    list.eachWithIndex { a, i ->
      ilike a, list2[ i ]
    }
    

    或假设 ilike 定义为:

    void ilike( String a, String b ) {
      println "I like $a and $b"
    }
    

    然后你可以做(​​使用transpose):

    [list,list2].transpose().each {
      ilike it
    }
    

    【讨论】:

    • +1 eachWithIndex 是我的首选。 transpose太“聪明”了一半,没人喜欢炫耀的蒂姆
    • @Don haha​​ha...我确实对ilike it的电话微笑了;-)
    • 我喜欢转置版本。很棒的东西。
    • 我不久前发了一篇关于这里发生了什么的帖子,详细介绍了 JVM 字节码中发生的事情:naleid.com/blog/2008/12/24/…
    • 为了更清楚,您可以在使用 javap 的字节码中看到的内容最终将您带到: MetaClassImpl.invokeMethod(Object object, String methodName, Object arguments),然后调用 invokeMethod(Object object, String methodName, Object[] originalArguments),因此如果存在与传播参数匹配的方法,它将自动从列表中传播参数。
    【解决方案2】:

    我不确定 iLike 会做什么,但是从您的原始 Java 代码的实现来看,我觉得您可能会考虑使用哈希映射,您的程序将如下所示

    def map= ['key1':'val1', 'key2':'val2', 'key2':val2, "key3":'val3']
    map.eachWithIndex{ it, i-> //eachIndex() always takes 2 params
      ilikeit it.key, it.value // and you have i if you need it in your program
    }
    

    以下可能是您的一个很好的参考点http://groovy.codehaus.org/JN1035-Maps

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多