Pregunta

Para dividir una matriz en dos partes iguales, haría esto,

>> a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
>> a.in_groups_of( (a.size/2.0).ceil ) if a.size > 0
=> [[1, 2, 3], [4, 5, nil]]

Ahora tengo una matriz anidada que contiene elementos nulos si el tamaño de la matriz es impar. ¿Cómo puedo eliminar los elementos nulos de las matrices anidadas? Quiero hacer algo como,

a.compact

Pero desafortunadamente eso no funciona, ruby ??solo elimina elementos nulos en el primer nivel y no de forma recursiva. ¿Ruby proporciona alguna buena solución para este problema?

¿Fue útil?

Solución

Con Ruby 1.8.7 y posterior puede hacer lo siguiente:

a.each &:compact!
=> [[1, 2, 3], [4, 5]]

Con Ruby 1.8.6, debe hacerlo a lo largo:

a.each {|s| s.compact!}

Ambos modificarán el contenido de a . Si desea devolver una nueva matriz y dejar el original solo, puede usar collect en lugar de each :

# 1.8.7+:
a.collect &:compact

# 1.8.6:
a.collect {|s| s.compact}

Otros consejos

Si tuviera que usar el in_groups_of puede pasarlo false como segundo argumento y no rellenará los espacios en blanco " con nil , pero realmente nada.

A menos que desee cambiar permanentemente a

a.map do |e|
  e.compact
end
arr_mixed=['hello', 2222, 'world', nil, [1, 2, 5, 'hi', nil],[1, 2, 3], [4,   5, nil]]

def compact_nested(array)
   arr2=[]
   array.each { |x|
   element = x.class==Array ? x.compact : x
   arr2<<element
   }
   arr2
end

p compact_nested(arr_mixed).compact #=>["hello", 2222, "world", [1, 2, 5, "hi"], [1, 2, 3], [4, 5]]
p arr_mixed #=>["hello", 2222, "world", nil, [1, 2, 5, "hi", nil], [1, 2, 3], [4, 5, nil]]
a.each {|subarray| subarray.compact!}
a.compact!

Debería funcionar ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top