/ / Fusionnez et entrelacez deux tableaux en Ruby - ruby, tableaux

Fusionner et entrelacer deux tableaux en Ruby - ruby, tableaux

J'ai le code suivant:

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

Je veux fusionner le tableau s en tableau a ce qui me donnerait:

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

En regardant à travers les documents Ruby Array et Enumerable, je ne vois pas une telle méthode pour y parvenir.

Est-il possible de faire cela sans parcourir chaque tableau?

Réponses:

163 pour la réponse № 1

Vous pouvez le faire avec:

a.zip(s).flatten.compact

33 pour la réponse № 2

Cela ne donnera pas un 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 utiliser a |= b. Si vous ne voulez pas muter a, tu peux écrire a | b et assigner le résultat à une variable.

Voir la documentation d'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 dupliquer les éléments du tableau. Si vous souhaitez 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, utilisation a + b et assigner le résultat à une variable.

En réponse à certains commentaires sur cette page, ces deux solutions fonctionneront avec des tableaux de toute taille.


29 pour la réponse № 3

Si vous ne voulez pas dupliquer, pourquoi ne pas utiliser simplement le syndicat opérateur:

new_array = a | s

7 pour la réponse № 4
s.inject(a, :<<)

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

Il ne vous donne pas l’ordre que vous avez demandé, mais c’est un bon moyen de fusionner deux tableaux en les ajoutant à celui-ci.


6 pour la réponse № 5

Voici une solution qui permet d’entrelacer plusieurs tableaux de différentes tailles (solution générale):

arr = [["Cat", "Dog", "Mouse", "boo", "zoo"],
["and", "&"],
["hello", "there", "you"]]

first, *rest = *arr; first.zip(*rest).flatten.compact
=> ["Cat", "and", "hello", "Dog", "&", "there", "Mouse", "you", "boo", "zoo"]

5 pour la réponse № 6

Ce n'est pas vraiment élégant, mais cela fonctionne pour les tableaux de toute taille:

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

2 pour la réponse № 7

Pourquoi pas une solution plus générale qui fonctionne même si le premier tableau n’est pas le plus long et accepte un nombre quelconque de tableaux?

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

b = a.max_by(&:length)
a -= [b]
b.zip(*a).flatten.compact

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

0 pour la réponse № 8

Une façon de faire l’entrelacement et de garantir celui qui est le plus grand tableau pour la méthode zip est de remplir l’un des tableaux avec nil jusqu'à la taille de l'autre tableau. De cette façon, vous garantissez également quel élément de quel tableau sera en première position:

preferred_arr = ["Cat", "Dog", "Mouse"]
other_arr = ["and","&","are","great","friends"]

preferred_arr << nil while preferred_arr.length < other_arr.length
preferred_arr.zip(other_arr).flatten.compact
#=> ["Cat", "and", "Dog", "&", "Mouse", "are", "great", "friends"]

-1 pour la réponse № 9
arr = [0, 1]
arr + [2, 3, 4]

//outputs [0, 1, 2, 3, 4]