46 votes

.collect avec un index

Existe-t-il un .collect avec un index ? Je veux faire quelque chose comme ça :

 def myList = [
    [position: 0, name: 'Bob'],
    [position: 0, name: 'John'],
    [position: 0, name: 'Alex'],
]

myList.collect { index ->
    it.position = index
}

(c'est-à-dire que je veux définir position sur une valeur qui indiquera l'ordre dans la liste)

101voto

Beryllium Points 5802

Depuis Groovy 2.4.0, il existe une withIndex() qui est ajoutée à java.lang.Iterable .

Donc, de façon fonctionnelle (pas d'effet secondaire, immuable), on dirait

 def myList = [
  [position: 0, name: 'Bob'],
  [position: 0, name: 'John'],
  [position: 0, name: 'Alex'],
]

def result = myList.withIndex().collect { element, index ->
  [position: index, name: element["name"]] 
}

13voto

Matt Points 566

Version légèrement plus groovy de collectWithIndex :

 List.metaClass.collectWithIndex = {body->
    def i=0
    delegate.collect { body(it, i++) }
}

ou même

 List.metaClass.collectWithIndex = {body->
    [delegate, 0..<delegate.size()].transpose().collect(body)
}

12voto

Rob Hruska Points 39151

eachWithIndex fonctionnerait probablement mieux :

 myList.eachWithIndex { it, index ->
    it.position = index
}

L'utilisation d'un collectX ne semble pas vraiment nécessaire puisque vous modifiez simplement la collection et ne retournez pas des morceaux particuliers de celle-ci dans une nouvelle collection.

7voto

dstarh Points 1666

Cela devrait faire exactement ce que vous voulez

 List.metaClass.collectWithIndex = {cls ->
    def i = 0;
    def arr = [];
    delegate.each{ obj ->
        arr << cls(obj,i++)
    }
    return arr
}



def myCol = [
    [position: 0, name: 'Bob'],
    [position: 0, name: 'John'],
    [position: 0, name: 'Alex'],
]


def myCol2 = myCol.collectWithIndex{x,t -> 
    x.position = t
    return x
}

println myCol2

=> [[position:0, name:Bob], [position:1, name:John], [position:2, name:Alex]]

5voto

pickypg Points 8948

Sans ajouter de méthodes d'extension, vous pouvez le faire de manière assez simple :

 def myList = [1, 2, 3]
def index = 0
def myOtherList = myList.collect {
  index++
}

Cependant, il serait certainement utile que cette méthode existe automatiquement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X