Pergunta

Para dividir uma matriz em duas partes iguais eu faria isso,

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

Agora eu tenho uma matriz aninhada que contém elementos nil se o tamanho da matriz é estranho. Como posso remover os elementos nulos das matrizes aninhadas? Eu quero fazer algo como:

a.compact

Mas, infelizmente, que não funciona, rubi só remove elementos nulo no primeiro nível e não de forma recursiva. O Ruby fornecer quaisquer soluções agradáveis ??para este problema?

Foi útil?

Solução

Com o Ruby 1.8.7 e mais tarde você pode fazer o seguinte:

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

Com o Ruby 1.8.6, você tem que fazer isso pelo caminho mais longo:

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

Ambas irão modificar o conteúdo de a. Se você quiser retornar uma nova matriz e deixar sozinho o original, você pode usar collect vez de each:

# 1.8.7+:
a.collect &:compact

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

Outras dicas

Se você fosse usar o in_groups_of você pode passá-lo false como o segundo argumento e não vai preencher os "espaços em branco", com nil, mas realmente nada.

A menos que você deseja alterar 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!

deve funcionar ....

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top