107 votes

Fusionner et entrelacer deux tableaux en Ruby

J'ai le code suivant :

a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]

Je veux fusionner le tableau s dans le tableau a qui me donnerait :

["Cat", "and", "Dog", "&", "Mouse"]

En regardant dans la documentation de Ruby Array et Enumerable, je ne vois pas de méthode permettant d'accomplir cela.

Y a-t-il un moyen de faire cela sans itérer dans chaque tableau ?

0 votes

A aura toujours 3 éléments et s deux ? d'autres exemples seraient utiles.

172voto

DigitalRoss Points 80400

Vous pouvez le faire avec :

a.zip(s).flatten.compact

4 votes

Et si a a plus de 3 éléments ?

0 votes

@DigitalRoss Pourquoi s.zip(a).flatten.compact ne renvoie que 4 éléments ?

118 votes

[ "a", "b" ].concat( [ "c", "d"] ) #=> [ "a", "b", "c", "d" ]

116voto

Leo Romanovsky Points 1477
[ "a", "b" ].concat( ["c", "d"] ) #=> [ "a", "b", "c", "d" ]

http://ruby-doc.org/core-1.9.3/Array.html#method-i-concat

34voto

Michael Stalker Points 794

Cela ne donnera pas un tableau de résultat dans l'ordre demandé par Chris, mais si l'ordre du tableau résultant n'a pas d'importance, vous pouvez simplement utiliser a |= b . Si vous ne voulez pas muter a vous pouvez écrire a | b et assigner le résultat à une variable.

Consultez la documentation sur l'union des ensembles pour la classe Array à l'adresse suivante http://www.ruby-doc.org/core/classes/Array.html#M000275 .

Cette réponse suppose que vous ne souhaitez pas dupliquer les éléments du tableau. Si vous voulez autoriser les éléments en double dans votre tableau final, a += b devrait faire l'affaire. Encore une fois, si vous ne voulez pas muter a utiliser a + b et assigner le résultat à une variable.

En réponse à certains commentaires sur cette page, ces deux solutions fonctionnent avec des tableaux de toutes tailles.

0 votes

Celui-ci semble être le meilleur.

12 votes

Cela donne ["Cat", "Dog", "Mouse", "and", "&"] ce qui n'est pas ce que le PO voulait.

0 votes

Excellent appel, Andrew. Je vais mettre à jour ma réponse pour dire que je n'ai pas répondu à la question de Chris.

6voto

John Points 1592
s.inject(a, :<<)

s   #=> ["and", "&"]
a   #=> ["Cat", "Dog", "Mouse", "and", "&"]

Cela ne vous donne pas l'ordre que vous avez demandé, mais c'est une façon agréable de fusionner deux tableaux en ajoutant à l'un.

0 votes

J'aime ça, court et propre. :)

1 votes

Pas aussi court et propre que a | s

5voto

Michael Kohl Points 33345

Ce n'est pas très élégant, mais cela fonctionne pour les tableaux de toutes tailles :

>> a.map.with_index { |x, i| [x, i == a.size - 2 ? s.last : s.first] }.flatten[0..-2] 
#=> ["Cat", "and", "Dog", "&", "Mouse"]

0 votes

+1 pour gérer les cas limites bizarres, je pense. i = s.cycle; a.map { |x| [x, i.next] }.flatten[0..-2] serait tout aussi valable.

0 votes

Je n'étais pas sûr que l'OP veuille alterner and et & donc je l'ai pris aussi littéralement que possible, tout en permettant à a de n'importe quelle longueur.

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