另一種方法,如果你想使用集合的索引其他方法比each
是定義enumerate
方法返回對[index, element]
,模擬Python's 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
因爲前者返回一個可迭代,而後來的回報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'more functional approach:
Iterable.metaClass.enumerate = { start = 0 ->
def end = start + delegate.size() - 1
[start..end, delegate].transpose()
}
哇,這是牽強,murdochjohn這樣做是正確 – loteq
@loteq這基本上就是我說...得到它的權利後,OP詢問_「其他解決方案」 _出於某種原因。另外,如果你想在'collect'中使用一個索引,'find',這是除了外部變量之外的唯一方法... –
很酷的答案,但是使用'with'會阻礙IMO解決方案的可讀性。我在我的鏈接你的答案,這在'枚舉'方法= D – epidemian