2010-03-27 14 views
5

Saluti!Assegnare a un array e sostituire i valori nil emessi

Quando si assegna un valore ad un array come nel seguito, come potrei sostituire le nil s da 0?

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

Se non è possibile durante l'assegnazione, come dovrei farlo in seguito? Ho pensato di array.map { |e| e.nil? ? 0 : e }, ma ben ...

Grazie!

+0

Poiché non riesco a ottenere valori falsi, l'opzione 'map' sembra adeguata. E sì, quello disordinato è davvero disordinato. :) Grazie per il vostro aiuto! – Tobias

risposta

5

Non esiste una funzione incorporata per sostituire nil in un array, quindi sì, map è la strada da percorrere. Se una versione più corta ti fa più felice, si potrebbe fare:

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

Per modificare l'array in posizione

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

Se l'array può contenere false avrete bisogno di utilizzare questa invece

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

Per cambiare la matrice dopo la cessione:

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

Si noti che questo converte anche false in 0.

Se si desidera utilizzare gli zeri durante assegnazione, è un po 'disordinato:

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

altro approccio sarebbe quello di definire la propria funzione per l'aggiunta di un valore alla matrice.

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 } 

Questa risposta è troppo corto, e sto aggiungendo qualche parola in più.

+1

Puoi utilizzare a.compact per questa funzione cosa stai facendo – sachin

1

nil.to_i è 0, se tutti i numeri sono interi, in seguito dovrebbe funzionare. Penso che sia anche la risposta più breve qui.

array.map!(&:to_i) 
Problemi correlati