Как указать начальное значение индекса в методе Groovy eachWithIndex? - PullRequest
2 голосов
/ 11 января 2012

При использовании метода Groovy eachWithIndex значение индекса начинается с 0, мне нужно, чтобы оно начиналось с 1. Как я могу это сделать?

Ответы [ 4 ]

7 голосов
/ 11 января 2012

Индекс всегда будет начинаться с 0

Ваши параметры:

1) Добавить смещение к индексу:

int offs = 1
list.eachWithIndex { it, idx ->
  println "$it @ pos ${idx + offs}"
}

2) Использовать что-токроме eachWithIndex (то есть: транспонировать список целых чисел, начинающийся с 1 с вашего исходного списка, а затем проходить через него)

3) Вы также можете использовать параметры по умолчанию для взлома такого рода вещи в ..Если мы передадим eachWithIndex закрытие с 3 параметрами (два, которых ожидает eachWithIndex и третий со значением по умолчанию index + 1):

[ 'a', 'b', 'c' ].eachWithIndex { item, index, indexPlusOne = index + 1 ->
  println "Element $item has position $indexPlusOne"
}

Мы дадим вывод:

Element a has position 1
Element b has position 2
Element c has position 3
3 голосов
/ 30 июля 2015

Я бы вообще не использовал eachWithIndex, цикл for с .indexed (1) будет более элегантным / читабельным:

for (item in ['a','b','c','d','e'].indexed(1)) {
  println("element $item.key = $item.value")
}

вывод:

element 1 = a
element 2 = b
element 3 = c
element 4 = d
element 5 = e

caveat -- indexed (n) доступен только в Groovy 2.4.0 и выше

0 голосов
/ 02 июня 2015

Как насчет использования Range ?

def offset = 1
def arr = [1,2,3,4,5]
def len = arr.size() - 1
arr[offset..len].eachWithIndex{n,i -> println "${i+offset}:$n"}
0 голосов
/ 03 февраля 2012

Вы также можете использовать некоторые методы метапрограммирования:

def eachWithMyIndex = { init, clos ->
    delegate.eachWithIndex { it, idx -> clos(it, idx + init) }
}
List.metaClass.eachWithMyIndex = eachWithMyIndex    

[1,2,3].eachWithMyIndex(10) {n, idx ->  println("element $idx = $n") }

дает вывод:

element 10 = 1
element 11 = 2
element 12 = 3
...