Ruby: Comment concaténer tableau de tableaux en un seul
J'ai un tableau de tableaux dans Ruby on Rails (3.1) où tous les tableaux sont de taille différente. Est-il un moyen facile de les concaténer tous les tableaux pour obtenir une seule grande dimesional tableau avec tous les éléments?
Je sais que vous pouvez utiliser le Tableau::fonction concat pour concaténer deux tableaux, et je pourrais faire une boucle pour les enchaîner de manière séquentielle comme suit:
concatenated = Array.new
array_of_arrays.each do |array|
concatenated.concat(array)
end
mais je voulais savoir si il était comme un Rubis one-liner qui permettrait de le faire dans un nettoyant manière.
Merci pour votre aide.
- Comme l'a suggéré,
flatten(1)
est ce que vous voulez, mais je tenais à préciser que vous pouvez écrire ce que vous avez ci-dessus commearray_of_arrays.reduce(:concat)
.
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la recherche pour
#aplatir
:Par défaut, il s'aplatit les listes de manière récursive.
#flatten
accepte un argument optionnel pour limiter la profondeur de récursivité – la documentation présente des exemples pour illustrer la différence.flatten(1)
. Éléments dans le tableau pourrait être array eux-mêmes et qu'ils devraient être de manière récursive aplatie.flatten!(n)
que cela modifie l'objet en place au lieu de faire une copie de celui-ci. En utilisant des méthodes qui modifient les objets en place, peut être plus performant en réduisant la quantité de GC qui devait être fait.Ou plus généralement:
#flatten
, vous devez être très conscient de ce que vos tableaux contiennent, comme c'est une méthode récursive, ce qui peut ou peut ne pas être souhaitable.flatten(n)
array_of_arrays
qui peut causer des problèmes si vous prévoyez d'utiliser le tableau d'origine d'ailleurs.Vous pouvez utiliser aplatir! la méthode. par exemple.
a = [ 1, 2, [3, [4, 5] ] ]
a.flatten! #=> [1, 2, 3, 4, 5]
a.flatten!
vous aussi vous empêcher d'émettre un duplicata de la matrice, d'économiser la mémoire et la collecte des ordures.