somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push(anotherarray.flatten!)
Esperaba
["some","thing","another","thing"]
ruby
arrays
multidimensional-array
ncvncvn
fuente
fuente
ri Array@flatten!
¿Por qué esta pregunta está obteniendo tantos votos? El documento es explícito SeArray#flatten!
aplana en su lugar. Devuelve nulo si no se realizaron modificaciones (es decir, la matriz no contieneflatten!
no funciona así. Finalmente, la pregunta refleja un problema lógico en lugar de un problema de optimización. Vea la respuesta de Pilcrow a continuación para obtener más información.Respuestas:
Tienes una idea viable, pero
#flatten!
está en el lugar equivocado: aplana su receptor, por lo que puedes usarlo para convertirlo[1, 2, ['foo', 'bar']]
en[1,2,'foo','bar']
.Sin duda, estoy olvidando algunos enfoques, pero puedes concatenar :
o anteponer / agregar :
o empalme :
o anexar y aplanar :
fuente
Array#concat
no asigna una nueva matriz, Concatenación conArray#+
sí¡Solo puedes usar el
+
operador!Puede leer todo sobre la clase de matriz aquí: http://ruby-doc.org/core/classes/Array.html
fuente
a+= b
crea una nueva matriz:c = a = [1,2] ; b = [3,4] ; a += b ; puts c #=> [1,2]
push
método descrito por @pilcrow.+=
crea un nuevo objeto. en tal ejemplo , se devolverá una[1, 2].each_with_object([]) { |number, object| object+=number }
matriz vacía[]
El enfoque más limpio es utilizar el método Array # concat ; no creará una nueva matriz (a diferencia de Array # + que hará lo mismo pero creará una nueva matriz).
Directamente de los documentos ( http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-concat ):
Entonces
La matriz # concat no aplanará una matriz multidimensional si se pasa como argumento. Tendrá que manejar eso por separado:
Por último, puede usar nuestra gema corelib ( https://github.com/corlewsolutions/corelib ) que agrega ayudantes útiles a las clases principales de Ruby. En particular, tenemos un método Array # add_all que aplanará automáticamente las matrices multidimensionales antes de ejecutar el concat.
fuente
Método fácil que funciona con la versión Ruby> = 2.0 pero no con versiones anteriores:
fuente
*
aquí?[*a, *b]
falla para versiones anteriores de ruby, es decir, 1.8.7. Y por mucho que Ruby quiera decirte que está fuera de la vida, RHEL6 aún se mantiene, lo que hace que Ruby 1.8 sea una versión objetivo significativa.[...array1, ...array2]
, solo recordando que elsplat
operador en ruby sería en*
lugar de...
. Hace que sea más fácil de recordarPrueba esto, combinará tus matrices eliminando duplicados
http://www.ruby-doc.org/core/classes/Array.html
Más documentación mira en "Set Union"
fuente
array1 |= [ "foo1", "bar1" ] #=> [ "foo", "bar", "foo1", "bar1" ]
Aquí hay dos formas, observe en este caso que la primera forma asigna una nueva matriz (se traduce en somearray = somearray + anotherarray)
fuente
Para añadir
b
aa
y almacenar el resultado ena
:o
En cualquier caso, se
a
convierte en:pero en el primer caso, los elementos de
b
se añaden a laa
matriz existente , y en el último caso las dos matrices se concatenan juntas y el resultado se almacena ena
.fuente
a.push(*b)
no es exactamente lo mismo quea += b
. El primero agrega los nuevos elementos a la matriz existente; este último crea una nueva matriz con todos los elementos y se los asignaa
. Puede ver la diferencia si hace algo comoaa = a
guardar la referenciaa
antes de cualquiera de los métodos de agregar y luego examinaraa
después. En el primer caso, cambia con el nuevo valor dea
, y en el segundo permanece sin cambios.(array1 + array2).uniq
De esta manera obtienes primero los elementos array1. No obtendrás duplicados.
fuente
Al elaborar la respuesta de @ Pilcrow, la única respuesta adecuada para grandes matrices es
concat
(+
) ya que es rápida y no asigna un nuevo objeto para ser recolectado como basura cuando se opera dentro de un bucle.Aquí está el punto de referencia:
Resultados:
Como puede ver, el uso
push
arroja un ERROR :stack level too deep (SystemStackError)
cuando las matrices son lo suficientemente grandes.fuente
La pregunta, esencialmente, es "cómo concatenar matrices en Ruby". Naturalmente, la respuesta es usar
concat
o+
como se menciona en casi todas las respuestas.Una extensión natural de la pregunta sería "cómo realizar una concatenación de filas 2D de matrices 2D en Ruby". Cuando busqué en Google "matrices de concatenación de rubíes", esta pregunta SO fue el resultado principal, así que pensé en dejar mi respuesta a esa pregunta (no formulada pero relacionada) aquí para la posteridad.
En algunas aplicaciones, es posible que desee "concatenar" dos matrices 2D en fila. Algo como,
Esto es algo así como "aumentar" una matriz. Por ejemplo, utilicé esta técnica para crear una matriz de adyacencia única para representar un gráfico de un conjunto de matrices más pequeñas. Sin esta técnica, habría tenido que iterar sobre los componentes de una manera que podría haber sido propensa a errores o frustrante. Podría haber tenido que hacer un
each_with_index
, por ejemplo. En cambio, combiné zip y flatten de la siguiente manera,fuente
Solo otra forma de hacerlo.
fuente
flatten
aplana todo lo más posible, recursivamente. Incluso matrices anidadas. En consecuencia, sisomearray
oanotherarray
contiene matrices anidadas, también se aplanan. Este es un efecto secundario que generalmente no está previsto.["some", "thing"] + ["another" + "thing"]
fuente
[*a] + [*b]
funciona"another" + "thing"
vaya a funcionar como se esperaba.Si los nuevos datos pueden ser una matriz o un escalar, y desea evitar que los nuevos datos se aniden si se tratara de una matriz, ¡el operador splat es increíble! Devuelve un escalar para un escalar y una lista desempaquetada de argumentos para una matriz.
fuente
Me sorprende que nadie haya mencionado
reduce
, lo que funciona bien cuando tienes una variedad de matrices:fuente
Esto no eliminará dups, pero
elimina dups.
fuente
Me resulta más fácil empujar o agregar matrices y luego aplanarlas en su lugar, así:
fuente
somearray = ["some", "thing"]
anotherarray = ["otro", "cosa"]
somearray + anotherarray
fuente