somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)
j'esperais
["some","thing","another","thing"]
ruby
arrays
multidimensional-array
ncvncvn
la source
la source
ri Array@flatten!
Pourquoi cette question obtient-elle autant de votes? Le doc est expliciteArray#flatten!
Flattens self in place. Renvoie nil si aucune modification n'a été apportée (c'est-à-dire que le tableau ne contient aucun sous-tableau.)flatten!
cela ne fonctionne pas comme ça. Enfin, la question reflète un problème de logique plutôt qu'un problème d'optimisation. Voir la réponse de pilcrow ci-dessous pour en savoir plus.Réponses:
Vous avez une idée réalisable, mais
#flatten!
est au mauvais endroit - il aplatit son récepteur, de sorte que vous pouvez l' utiliser pour transformer[1, 2, ['foo', 'bar']]
en[1,2,'foo','bar']
.J'oublie sans doute certaines approches, mais vous pouvez concaténer :
ou ajouter / ajouter :
ou épissure :
ou ajouter et aplatir :
la source
Array#concat
n'alloue pas de nouveau tableau, Concaténation avec leArray#+
faitVous pouvez simplement utiliser l'
+
opérateur!Vous pouvez tout lire sur la classe array ici: http://ruby-doc.org/core/classes/Array.html
la source
a+= b
crée un nouveau tableau:c = a = [1,2] ; b = [3,4] ; a += b ; puts c #=> [1,2]
push
méthode décrite par @pilcrow.+=
crée un nouvel objet. dans un tel exemple, un[1, 2].each_with_object([]) { |number, object| object+=number }
tableau vide[]
sera retournéL'approche la plus propre consiste à utiliser la méthode Array # concat ; il ne créera pas de nouveau tableau (contrairement à Array # + qui fera la même chose mais créera un nouveau tableau).
Directement à partir des documents ( http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-concat ):
Donc
Array # concat n'aplatira pas un tableau multidimensionnel s'il est passé en argument. Vous devrez gérer cela séparément:
Enfin, vous pouvez utiliser notre gem corelib ( https://github.com/corlewsolutions/corelib ) qui ajoute des aides utiles aux classes de base Ruby. En particulier, nous avons une méthode Array # add_all qui aplatira automatiquement les tableaux multidimensionnels avant d'exécuter le concat.
la source
Méthode simple qui fonctionne avec la version Ruby> = 2.0 mais pas avec les versions plus anciennes:
la source
*
ici?[*a, *b]
échoue pour les anciennes versions de ruby, c'est-à-dire 1.8.7. Et autant que Ruby veut vous dire qu'il est hors de vie, RHEL6 est toujours maintenu, ce qui fait de Ruby 1.8 une version cible importante.[...array1, ...array2]
, en vous rappelant simplement que l'splat
opérateur dans ruby serait à la*
place de...
. Il est plus facile de se souvenirEssayez ceci, il combinera vos tableaux en supprimant les doublons
http://www.ruby-doc.org/core/classes/Array.html
Pour plus de documentation, regardez "Set Union"
la source
array1 |= [ "foo1", "bar1" ] #=> [ "foo", "bar", "foo1", "bar1" ]
Voici deux façons, notez dans ce cas que la première façon assigne un nouveau tableau (se traduit par somearray = somearray + anotherarray)
la source
Pour ajouter
b
àa
et stocker le résultat dansa
:ou
Dans les deux cas,
a
devient:mais dans le premier cas, les éléments de
b
sont ajoutés aua
tableau existant , et dans le second cas, les deux tableaux sont concaténés ensemble et le résultat est stocké dansa
.la source
a.push(*b)
n'est pas exactement le même quea += b
. Le premier ajoute les nouveaux éléments au tableau existant; ce dernier crée un nouveau tableau avec tous les éléments et l'assigne àa
. Vous pouvez voir la différence si vous faites quelque chose commeaa = a
enregistrer la référencea
avant l'une ou l'autre méthode d'ajout, puis l'examineraa
ensuite. Dans le premier cas, il change avec la nouvelle valeur dea
, et dans le second, il reste inchangé.(array1 + array2).uniq
De cette façon, vous obtenez d'abord les éléments array1. Vous n'aurez aucun doublon.
la source
En élaborant la réponse de @ Pilcrow, la seule réponse appropriée pour les énormes tableaux est
concat
(+
) car elle est rapide et n'alloue pas un nouvel objet à récupérer les ordures lors de son fonctionnement dans une boucle.Voici la référence:
Résultats:
Comme vous pouvez le voir en utilisant
push
jette une ERREUR :stack level too deep (SystemStackError)
lorsque les tableaux sont assez grands.la source
La question, essentiellement, est "comment concaténer des tableaux en Ruby". Naturellement, la réponse est d'utiliser
concat
ou+
comme mentionné dans presque toutes les réponses.Une extension naturelle de la question serait "comment effectuer la concaténation ligne par ligne des tableaux 2D dans Ruby". Lorsque j'ai googlé "matrices de concaténation rubis", cette question SO était le meilleur résultat, alors j'ai pensé laisser ma réponse à cette question (non demandée mais liée) ici pour la postérité.
Dans certaines applications, vous souhaiterez peut-être "concaténer" deux tableaux 2D en ligne. Quelque chose comme,
C'est quelque chose comme "augmenter" une matrice. Par exemple, j'ai utilisé cette technique pour créer une seule matrice d'adjacence pour représenter un graphique à partir d'un tas de matrices plus petites. Sans cette technique, j'aurais dû parcourir les composants d'une manière qui aurait pu être source d'erreurs ou frustrante. J'aurais peut-être dû faire un
each_with_index
, par exemple. Au lieu de cela, j'ai combiné zip et aplatir comme suit,la source
Juste une autre façon de le faire.
la source
flatten
aplatit tout autant que possible, récursivement. Même des tableaux imbriqués. Par conséquent, sisomearray
ouanotherarray
contient des tableaux imbriqués, ils s'aplatissent également. Il s'agit d'un effet secondaire qui n'est généralement pas prévu.["some", "thing"] + ["another" + "thing"]
la source
[*a] + [*b]
travaux"another" + "thing"
fonctionnera comme prévu.Si les nouvelles données peuvent être un tableau ou un scalaire et que vous souhaitez empêcher l'imbrication des nouvelles données s'il s'agissait d'un tableau, l'opérateur splat est génial! Il retourne un scalaire pour un scalaire et une liste décompactée d'arguments pour un tableau.
la source
Je suis surpris que personne ne l'ait mentionné
reduce
, ce qui fonctionne bien lorsque vous disposez d'un tableau de tableaux:la source
Cela ne supprimera pas les doublons, mais
supprime les doublons.
la source
Je trouve plus facile de pousser ou d'ajouter des tableaux, puis de les aplatir en place, comme suit:
la source
somearray = ["certains", "chose"]
anotherarray = ["autre", "chose"]
un tableau + un autre tableau
la source