Comment «couper» une collection dans Groovy
J'ai une collection d'objets que j'ai envie de casser vers le haut dans une collection de collections, où chaque séquence de groupe de 3 éléments est en une collection.
Par exemple, si j'ai
def l = [1,4,2,4,5,9]
Je veux en faire:
def r = [[1,4,2], [4,5,9]]
Je le fais maintenant par itération sur la collecte et la rupture vers le haut.. mais je puis avoir besoin de passer ces "groupes" dans un parallélisée fonction qui traite.. Il serait bon d'éliminer cette O(n) pré-traitement et de juste dire quelque chose comme
l.slice(3).collectParallel { subC -> process(subC) }
J'ai trouvé la méthode pas à pas sur la Gamme de la classe, mais il semble que ce n'agit que sur les indices. Toutes les idées intelligentes?
Mise à jour:
Je ne pense pas que c'est un doublon du lien référencé, même si c'est très proche. Comme indiqué ci-dessous, c'est plus de l'itérateur de type chose, je suis à la recherche de.. la sous-collections seront ensuite passés dans un GPars collectParallel. Idéalement, je n'aurais pas besoin d'allouer une toute nouvelle collection.
source d'informationauteur Bobby
Vous devez vous connecter pour publier un commentaire.
Découvrez groovy 1.8.6. Il y a un nouveau rassembler méthode sur la Liste.
Prendre un coup d'oeil à la Groovy Liste de la documentation pour plus d'info, car il ya un couple d'autres paramètres que vous donner quelques autres options, y compris en laissant tomber le reste.
En ce qui concerne votre traitement en parallèle, vous pouvez faire une croisière à travers les listes avec gpars.
Si je vous comprends bien, vous êtes en train de copier les éléments de la collection d'origine dans le sous-collections. Pour plus de suggestions long de ces lignes, la caisse de l'réponses à la question suivante: Diviser la collecte en sous-collections en Groovy
Il semble que vous vous êtes plutôt à la recherche d'un moyen pour les sous-collections effectivement être vue dans la collection d'origine. Si c'est le cas, consultez la Liste.sous-liste() la méthode. Vous pouvez soit en boucle sur les indices de 0 à taille() par incréments de 3 (ou quelle que soit la taille de la tranche de votre choix) ou vous pouvez obtenir de l'amateur et de construire un objet iterable/la Liste qui permettrait de masquer les détails de l'appelant. Voici une implémentation de ce dernier, inspiré par Ted répondre.
J'aime bien les deux solutions, mais voici une version légèrement améliorée de la première solution que j'aime beaucoup:
Il n'y a pas quelque chose de construit dans, de faire exactement ce que vous voulez, mais si nous
@Delegate
appels pour le natif des listes de l'itérateur, nous pouvons écrire notre propre classe, qui fonctionne exactement comme un Itérateur qui retourne les morceaux que vous cherchez:Parce qu'il possède toutes les méthodes que l'Itérateur n', vous obtenez le groovy sucre syntaxique méthodes pour gratuit avec lazy evaluation sur tout ce qui a un
iterator()
méthode, comme une plage: