2010-03-27 12 views
5

¡Saludos!Asignar a una matriz y reemplazar valores nulos emergentes

Al asignar un valor a una matriz como la siguiente, ¿cómo podría reemplazar la nil s por 0?

array = [1,2,3] 
array[10] = 2 
array # => [1, 2, 3, nil, nil, nil, nil, nil, nil, nil, 2] 

Si no es posible al asignar, ¿cómo lo haré de la mejor manera después? Pensé en array.map { |e| e.nil? ? 0 : e }, pero bueno ...

¡Gracias!

+0

Como no puedo obtener ningún valor falso, la opción 'map' parece ser adecuada. Y sí, el desordenado es realmente desordenado. :) ¡Gracias por su ayuda! – Tobias

Respuesta

5

No hay función incorporada para reemplazar nil en una matriz, así que sí, map es el camino a seguir. Si una versión más corta le haría más feliz, que podría hacer:

array.map {|e| e ? e : 0} 
1

Para cambiar la matriz en su lugar

array.map!{|x|x ?x:0} 

Si la matriz puede contener false tendrá que usar esto en vez

array.map!{|x|x.nil? ? 0:x} 
12

Para cambiar la matriz después de la asignación:

array.map! { |x| x || 0 } 

Tenga en cuenta que esto también convierte false en 0.

Si desea utilizar ceros durante asignación, que es un poco desordenado:

i = 10 
a = [1, 2, 3] 
a += ([0] * (i - a.size)) << 2 
# => [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 2] 
0

Otro enfoque sería definir su propia función para añadir un valor a la matriz.

class Array 
    def addpad(index,newval) 
    concat(Array.new(index-size,0)) if index > size 
    self[index] = newval 
    end 
end 

a = [1,2,3] 
a.addpad(10,2) 
a => [1,2,3,0,0,0,0,0,0,0,2] 
1
a.select { |i| i } 

Esta respuesta es demasiado corta, así que estoy añadiendo algunas palabras más.

+1

Puede usar acompact para esta función lo que está haciendo – sachin

1

nil.to_i es 0; si todos los números son enteros, a continuación debería funcionar. Creo que también es la respuesta más corta aquí.

array.map!(&:to_i) 
Cuestiones relacionadas