J'ai le code suivant:
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
Je veux fusionner le tableau s
dans un tableau a
qui me donnerait:
["Cat", "and", "Dog", "&", "Mouse"]
En parcourant les documents Ruby Array et Enumerable, je ne vois pas une telle méthode qui accomplira cela.
Existe-t-il un moyen de le faire sans parcourir chaque tableau?
Réponses:
Vous pouvez le faire avec:
la source
a
avait plus de 3 éléments?[a, s].transpose
sauf que les deux lignes ne sont pas conformes, laissant#zip
comme solution évidente. Et je ne pense pas qu'il voulait dire qu'il se souciait vraiment de savoir s'ila
était muté ... Je ne pense pas qu'il parlait du tout d'une solution mutée vs fonctionnelle, il essayait juste de décrire le schéma.Cela ne donnera pas de tableau de résultats dans l'ordre demandé par Chris, mais si l'ordre du tableau résultant n'a pas d'importance, vous pouvez simplement l'utiliser
a |= b
. Si vous ne souhaitez pas mutera
, vous pouvez écrirea | b
et affecter le résultat à une variable.Consultez la documentation set union pour la classe Array à l' adresse http://www.ruby-doc.org/core/classes/Array.html#M000275 .
Cette réponse suppose que vous ne voulez pas d'éléments de tableau en double. Si vous souhaitez autoriser les éléments en double dans votre tableau final, vous
a += b
devriez faire l'affaire. Encore une fois, si vous ne voulez pas mutera
, utiliseza + b
et affectez le résultat à une variable.En réponse à certains des commentaires sur cette page, ces deux solutions fonctionneront avec des tableaux de toute taille.
la source
["Cat", "Dog", "Mouse", "and", "&"]
, ce qui n'est pas ce que voulait l'OP.Si vous ne voulez pas de duplication, pourquoi ne pas simplement utiliser l' opérateur union :
la source
s
seront à la fin du nouveau tableau.Cela ne vous donne pas l'ordre que vous avez demandé, mais c'est un bon moyen de fusionner deux tableaux en les ajoutant à l'un.
la source
Voici une solution qui permet d'entrelacer plusieurs tableaux de différentes tailles (solution générale):
la source
Ce n'est pas vraiment élégant, mais cela fonctionne pour les tableaux de toutes tailles:
la source
i = s.cycle; a.map { |x| [x, i.next] }.flatten[0..-2]
serait tout aussi valable.and
et&
, donc je l'ai pris aussi littéralement que possible, tout en tenant comptea
de n'importe quelle longueur.Que diriez-vous d'une solution plus générale qui fonctionne même si le premier tableau n'est pas le plus long et accepte n'importe quel nombre de tableaux?
la source
Pour gérer la situation où les deux
a
&s
ne sont pas de la même taille:.compact
supprimeranil
quanda
est plus grand ques
| s
ajoutera les éléments restants à partir des
quanda
est plus petit ques
la source
Une façon de faire l'entrelacement et de garantir également lequel est le plus grand tableau pour la méthode zip, est de remplir l'un des tableaux avec
nil
jusqu'à l'autre taille de tableau. De cette façon, vous garantissez également quel élément de quel tableau sera en première position:la source
preferred_arr.zip(other_arr).flatten | other_arr
(sans le remblayage nul)la source