另一种方法,如果你想在其他方法上使用集合的索引,而不是each
定义一个enumerate
返回 pairs 的方法[index, element]
,类似于Python 的 enumerate:
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
而不是split
因为前者返回 Iterable,而后者返回 a String[]
)
我们可以使用这个新的集合each
,如你所愿:
'one two three'.tokenize().enumerate().each { index, word ->
println "$index: $word"
}
或者我们可以将它与其他迭代方法一起使用:D
def repetitions = 'one two three'.tokenize().enumerate(1).collect { n, word ->
([word] * n).join(' ')
}
assert repetitions == ['one', 'two two', 'three three three']
注意:定义该方法的另一种enumerate
方法,遵循 tim_yates 的更多功能方法是:
Iterable.metaClass.enumerate = { start = 0 ->
def end = start + delegate.size() - 1
[start..end, delegate].transpose()
}