groovy - 是否有任何隐式变量来访问“each”方法中的项索引

时间:2012-04-30 07:36:53

标签: groovy

有没有办法在以下示例中删除变量“i”,仍然可以访问正在打印的项目的索引?

def i = 0;
"one two three".split().each  {
    println ("item [ ${i++} ] = ${it}");
}

===============编辑================

我发现一种可能的解决方案是使用“eachWithIndex”方法:

"one two three".split().eachWithIndex  {it, i
    println ("item [ ${i} ] = ${it}");
}

如果有其他解决方案,请告诉我。

3 个答案:

答案 0 :(得分:12)

您可以使用eachWithIndex()

"one two three four".split().eachWithIndex() { entry, index ->
      println "${index} : ${entry}" }

这将导致

0 : one
1 : two
2 : three
3 : four

答案 1 :(得分:0)

不确定'其他解决方案'你正在寻找...我能想到的唯一一件事(使用Groovy 1.8.6)就像是:

"one two three".split().with { words ->
  [words,0..<words.size()].transpose().collect { word, index ->
    word * index
  }
}

正如您所看到的,这允许您将collect与索引一起使用(因为没有collectWithIndex方法)。

答案 2 :(得分:0)

另一种方法是,如果要在除each之外的其他方法上使用集合的索引,则定义返回对enumerate的{​​{1}}方法,类似于Python's enumerate }:

[index, element]

所以,例如:

Iterable.metaClass.enumerate = { start = 0 -> 
    def index = start
    delegate.collect { [index++, it] }
}

(请注意我使用assert 'un dos tres'.tokenize().enumerate() == [[0,'un'], [1,'dos'], [2,'tres']] 代替tokenize,因为前者返回Iterable,而后者则返回split

我们可以根据需要将此新集合与String[]一起使用:

each

或者我们可以将它与其他迭代方法一起使用:D

'one two three'.tokenize().enumerate().each { index, word ->
    println "$index: $word"
}

注意:在tim_yates'more functional approach之后定义def repetitions = 'one two three'.tokenize().enumerate(1).collect { n, word -> ([word] * n).join(' ') } assert repetitions == ['one', 'two two', 'three three three'] 方法的另一种方法是:

enumerate