matriz lista for elemento declarar crear bidimensionales arreglos arreglo agregar ruby arrays

lista - Fusiona e intercala dos matrices en Ruby



for en ruby (9)

¿Qué tal una solución más general que funciona incluso si la primera matriz no es la más larga y acepta cualquier cantidad de matrices?

a = [ ["and", "&"], ["Cat", "Dog", "Mouse"] ] b = a.max_by(&:length) a -= [b] b.zip(*a).flatten.compact => ["Cat", "and", "Dog", "&", "Mouse"]

Tengo el siguiente código:

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

Quiero fusionar la matriz s en a matriz que me daría:

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

Mirando a través de Ruby Array y los documentos de 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?


Aquí hay una solución que permite intercalar matrices múltiples de diferentes tamaños (solución general):

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"]


Esto no dará una matriz de resultados en el orden que Chris pidió, pero si el orden de la matriz resultante no importa, puede usar a |= b . Si no quiere mutar a , puede escribir a | b a | b y asigne el resultado a una variable.

Consulte la documentación sindical establecida para la clase Array en http://www.ruby-doc.org/core/classes/Array.html#M000275 .

Esta respuesta asume que no quieres elementos de matriz duplicados. Si desea permitir elementos duplicados en su matriz final, a += b debería hacer el truco. Nuevamente, si no quiere mutar a , use a + b y asigne el resultado a una variable.

En respuesta a algunos de los comentarios en esta página, estas dos soluciones funcionarán con matrices de cualquier tamaño.


No es exactamente elegante, pero funciona para arreglos de cualquier tamaño:

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


Puedes hacer eso con:

a.zip(s).flatten.compact


Si no quiere duplicar, ¿por qué no simplemente usar el operador de la union ?

new_array = a | s


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 hasta el otro tamaño de matriz. De esta forma, también garantizas qué elemento de qué matriz estará en la primera posición:

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"]


arr = [0, 1] arr + [2, 3, 4] //outputs [0, 1, 2, 3, 4]


s.inject(a, :<<) s #=> ["and", "&"] a #=> ["Cat", "Dog", "Mouse", "and", "&"]

No te da el orden que pediste, pero es una forma agradable de combinar dos matrices al agregarlas.