Tengo el siguiente código:
a = ["Cat", "Dog", "Mouse"]
s = ["and", "&"]
Quiero fusionar la matriz s
en una matriz a
que me daría:
["Cat", "and", "Dog", "&", "Mouse"]
Mirando a través de los documentos Ruby Array y Enumerable, no veo un método que logre esto.
¿Hay alguna forma de que pueda hacer esto sin iterar a través de cada matriz?
Respuestas:
Puedes hacer eso con:
fuente
a
tiene más de 3 elementos?[a, s].transpose
excepto que las dos filas no se ajustan, dejando#zip
como solución obvia. Y no creo que quisiera decir que realmente le importaba sia
estaba mutado ... No creo que estuviera comentando sobre una solución mutada frente a una solución funcional, solo estaba tratando de describir el patrón.Esto no dará una matriz de resultados en el orden que pidió Chris, pero si el orden de la matriz resultante no importa, puede usar
a |= b
. Si no desea mutara
, puede escribira | b
y asignar el resultado a una variable.Consulte la documentación de unión de conjuntos para la clase Array en http://www.ruby-doc.org/core/classes/Array.html#M000275 .
Esta respuesta asume que no desea elementos de matriz duplicados. Si desea permitir elementos duplicados en su matriz final,
a += b
debería hacer el truco. Nuevamente, si no desea mutara
, usea + b
y asigne el resultado a una variable.En respuesta a algunos de los comentarios de esta página, estas dos soluciones funcionarán con matrices de cualquier tamaño.
fuente
["Cat", "Dog", "Mouse", "and", "&"]
, que no es lo que quería el OP.Si no desea duplicar, ¿por qué no usar el operador de unión ?
fuente
s
estarán al final de la nueva matriz.No le da el orden que pidió, pero es una buena forma de fusionar dos matrices agregando una.
fuente
Aquí hay una solución que permite intercalar múltiples matrices de diferentes tamaños (solución general):
fuente
No es exactamente elegante, pero funciona para matrices de cualquier tamaño:
fuente
i = s.cycle; a.map { |x| [x, i.next] }.flatten[0..-2]
que sería igualmente válido.and
y&
, por lo tanto, lo tomé lo más literalmente posible, mientras permitíaa
cualquier longitud.¿Qué tal una solución más general que funcione incluso si la primera matriz no es la más larga y acepta cualquier cantidad de matrices?
fuente
Para manejar la situación en la que ambos
a
&s
no son del mismo tamaño:.compact
eliminaránil
cuandoa
sea mayor ques
| s
agregará los elementos restantes des
cuandoa
sea menor ques
fuente
Una forma de hacer la intercalación y también garantizar cuál es la matriz más grande para el método zip, es llenar una de las matrices con
nil
el tamaño de la otra matriz. De esta manera, también garantiza qué elemento de qué matriz estará en la primera posición:fuente
preferred_arr.zip(other_arr).flatten | other_arr
(sin el relleno nulo)fuente