Groovy Carte de Listes dans la Liste des Cartes
Donc, essentiellement, j'ai quelque chose comme ceci:
[a: ["c","d"], b: ["e","f"]]
Le nombre d'éléments dans chaque liste est arbitraire. Si il y a un seul élément de la liste n'est plus une liste et c'est une chaîne.
Je veux le transformer en:
[ [a:"c", b:"e"], [a:"d",b:"f"] ]
Je ne m'en soucie pas vraiment si la solution utilise Groovy méthodes ou non. Merci pour votre aide!
Partager le code que vous avez essayé jusqu'à présent...
Je n'ai pas de code parce que je suis perplexe sur une belle façon de le faire. J'espérais qu'il y avait quelques intégré dans les méthodes à utiliser.
Je n'ai pas de code parce que je suis perplexe sur une belle façon de le faire. J'espérais qu'il y avait quelques intégré dans les méthodes à utiliser.
OriginalL'auteur James Kleeh | 2013-03-22
Vous devez vous connecter pour publier un commentaire.
Voici une autre façon de faire, qui je pense est moins obscur, tout en restant assez concis:
Si vous ne voulez pas ou ne pouvez pas utiliser
withDefault
(parce que vous ne voulez pas la liste de croître automatiquement), puis cela fonctionne:Modifier: Ajout de code pour gérer les chaînes de caractères ne figurant pas dans une liste.
Note, le truc (
[values].flatten().eachWithIndex{...}
) n'est pas forcément très efficace. Si la vitesse est essentielle, puis à l'aide ce serait un peu plus rapide au détriment de la lisibilité:withDefault
est ce qui me manquait. Ce ne marche pas encore gérer le cas de la valeur à une chaîne, voici donc la udpated code: "si (les valeurs instanceof ArrayList) { valeurs.eachWithIndex { valeur, index -> lm[index][k] = valeur } } else { lm[0][k] = valeurs }`OK, c'était un peu enterré à votre question initiale, mais je le vois maintenant. Juste un avis: vous auriez mieux fait d'utiliser
values instanceof List
, car il est plus souple si vous avez besoin de modifier la Liste à une date ultérieure.OriginalL'auteur OverZealous
One-liner, en supposant que x =
[a: ["c","d"], b: ["e","f"]]
ou x =[a: "b", c: "d"]
:Comment cela fonctionne:
D'abord, diviser les clés et valeurs:
[x*.key, x*.value]
=[[a, b], [[c, d], [e, f]]]
Les transposer à la paire de clés et de valeurs:
[[a, b], [[c, d], [e, f]]].transpose()
=[[a, [c, d]], [b, [e, f]]]
Utilisation
combinations
de mettre la clé avec ses valeurs (la propagation de l'opérateur utilisé ici pour l'appliquer à chaque élément de la liste). Notez que les combinaisons ne traitent à la fois de[a:b]
ou[a:[b,c]]
correctement:[[a, [c, d]], [b, [e, f]]]*.combinations()
=[[[a, c], [a, d]], [[b, e], [b, f]]]
Transposer les listes de sorte que nous nous retrouvons avec abab au lieu de l'aabb (si imbriquée un peu):
[[[a, c], [a, d]], [[b, e], [b, f]]].transpose()
=[[[a, c], [b, e]], [[a, d], [b, f]]]
Aplatir les listes imbriquées (à l'aide d'étaler à nouveau pour aplatir listes imbriquées,mais pas toute la liste):
[[[a, c], [b, e]], [[a, d], [b, f]]]*.flatten()
=[[a, c, b, e], [a, d, b, f]]
Propagation
toSpreadMap
pour convertir cette liste dans une liste de cartes.[[a, c, b, e], [a, d, b, f]]*.toSpreadMap()
=[*:[b:e, a:c], *:[b:f, a:d]]
OriginalL'auteur slipheed
Définir quelques fonctions:
puis de les assembler et de tester:
La carte les entrées qui sont des chaînes de caractères, et la carte d'entrée d'une liste de différentes longueurs:
[[[a:c], [b:e]], [[a:d], [b:f]]]
. Cela devrait être[ [a:"c", b:"e"], [a:"d",b:"f"] ]
OriginalL'auteur Nathan Hughes
Voici ce que j'ai fait. Si quelqu'un a une meilleure solution, laissez-moi savoir et je vais l'accepter comme réponse.
OriginalL'auteur James Kleeh