7

次の例で変数「i」を削除しても、印刷されているアイテムのインデックスにアクセスする方法はありますか?

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

===============編集================

考えられる解決策の1つは、「eachWithIndex」メソッドを使用することです。

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

他に解決策があるかどうか教えてください。

4

3 に答える 3

12

あなたが使用することができますeachWithIndex()

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

これにより、

0 : one
1 : two
2 : three
3 : four
于 2012-04-30T08:16:00.673 に答える
0

Python の enumerateに類似した、pairs を返すメソッドeachを定義する以外のメソッドでコレクションのインデックスを使用する場合の別のアプローチ: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']]

(前者は Iterable を返し、後者は a を返すため、tokenize代わりに使用していることに注意してください)splitString[]

この新しいコレクションを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()
}
于 2012-04-30T19:02:26.517 に答える
0

あなたが探している「他のソリューション」がわからない...私が考えることができる他の唯一のことは(Groovy 1.8.6で)、次のようなものです:

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

ご覧のとおり、これによりcollectインデックスを使用することもできます (メソッドがないcollectWithIndexため)。

于 2012-04-30T08:31:05.973 に答える