有没有办法在以下示例中删除变量“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}");
}
如果有其他解决方案,请告诉我。
答案 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