2009-11-09 11 views
26

¿Cómo puedo sustituir un elemento en una matriz?¿Cómo reemplazo el elemento de una matriz?

a = [1,2,3,4,5] 

tengo que sustituir 5 con [11,22,33,44].flatten!

de manera que se convierte ahora en a

a = [1,2,3,4,11,22,33,44] 
+1

por favor, nos da una explicación de por qué necesita hacer esto y en qué contexto esto es – Earlz

+0

podría querer cambiar el título de cómo sustituir los elementos de la matriz en un iterador de estilo 'cada' ruby ​​ – peterk

Respuesta

42
No

seguro si usted está buscando para sustituir un valor particular o no, pero esto funciona:

a = [1, 2, 3, 4, 5] 
b = [11, 22, 33, 44] 
a.map! { |x| x == 5 ? b : x }.flatten! 

Este itera sobre los valores de a, y cuando encuentra un valor de 5, reemplaza ese valor con la matriz b, luego aplana las matrices en una matriz.

+2

Si bien esto funciona, es demasiado complicado para lo que el cartel original intenta hacer. El uso de arreglos de matriz para reemplazar un rango es una solución más simple y directa. Ver [esta respuesta] (http://stackoverflow.com/a/1704805/456814). –

+0

@Ryan McGeary Necesito el mismo método excepto el valor de 5 Quiero reemplazar todos los números en la matriz divisible por 3 con una palabra "BINGO". Como hacer eso. Intenté 'ary = (0..100) .to_a ary.map! {| I | i% 3 == 0? i: "BINGO"} 'Reemplaza a todos excepto los divisibles por 3 – DebRaj

+0

¡funciona como un amuleto para mí! ¡Gracias! – ramya

0

gweg, no está seguro de lo que estás tratando de hacer aquí, pero estás buscando algo como ¿esta?

a = [1, 2, 3, 4, 5] 
a.delete_at(4) 
a = a.concat([11,22,33,44]) 

Existen varias formas de hacerlo: no creo que el código anterior sea especialmente atractivo. Todo depende de la importancia de '5' en tu matriz original.

18

Quizás quiso decir:

a[4] = [11,22,33,44] # or a[-1] = ... 
a.flatten! 

Una solución funcional podría ser más agradable, ¿qué hay de justo:

a[0..-2] + [11, 22, 33, 44] 

que produce ...

=> [1, 2, 3, 4, 11, 22, 33, 44] 
+1

+1 agradable! !! solo una pequeña corrección, en la primera línea es 'a [4]' no 'a [5]' – alfasin

+0

Roger, corregido ... – DigitalRoss

+1

+1 ¡Gracias! La solución funcional era más adaptable a cuando quería reemplazar un elemento por dos valores en una ubicación variable en la matriz, es decir: a [0..b-1] + [val1, val2] + [b + 1 .. -1] – mm2001

5

Realmente no lo hace tiene que aplanarse si acaba de concatenar. Así que recortar el último elemento de la primera matriz y concatenar:

a = [ 1, 2, 3, 4, 5 ]   #=> [1, 2, 3, 4, 5] 
t = [11, 22, 33, 44]   #=> [11, 22, 33, 44] 
result = a[0..-2] + t   #=> [1, 2, 3, 4, 11, 22, 33, 44] 

a [0 ..- 2] es una operación de división que lleva todos excepto el último elemento de la matriz.

Espero que ayude!

5

Esta variante encontrará el 5 sin importar en qué parte de la matriz se encuentre.

a = [1, 2, 3, 4, 5] 
a[a.index(5)]=[11, 22, 33, 44] if a.index(5) 
a.flatten! 
14

La versión de bta usando a.index (5) es el más rápido:

a[a.index(5)] = b if a.index(5) # 5.133327 sec/10^6 

Al menos un 10% más rápido que Ryan McGeary 's uno:

a.map!{ |x| x == 5 ? b : x } # 5.647182 sec/10^6 

Sin embargo, cabe destacar que una .index (5) solo devuelve el primer índice donde se encuentra 5. Así, dada una matriz en donde 5 aparece más de una vez, los resultados serán diferentes:

a = [1, 2, 3, 4, 5, 5] 
b = [11,22,33,44] 

a[a.index(5)] = b if a.index(5) 
a.flatten # => [1, 2, 3, 4, 11, 22, 33, 44, 5] 

a.map!{ |x| x == 5 ? b : x } 
a.flatten # => [1, 2, 3, 4, 11, 22, 33, 44, 11, 22, 33, 44] 
6

Array#delete será devolver el artículo o nula.Usted puede usar esto para saber si o no para empujar sus nuevos valores

a.push 11,22,33,44 if a.delete 5 
+0

¡Este es un trabajo muy limpio y agradable! – bagofcole

1

Aquí es otra forma sencilla de reemplazar el valor 5 en la matriz:

a[-1, 1] = [11, 22, 33, 44] 

Este utiliza el método Array#[]=. Aunque no estoy muy seguro de por qué funciona.

Cuestiones relacionadas