2013-05-30 11 views
9

Voglio creare un array di dimensioni fisse con un numero predefinito di elementi già riempite da un altro array, così lascia dire che ho questo metodo:Creare un array con una dimensione fissa e riempire il contenuto predefinito con un altro array?

def fixed_array(size, other) 
    array = Array.new(size) 
    other.each_with_index { |x, i| array[i] = x } 
    array 
end 

Allora posso utilizzare il metodo come:

fixed_array(5, [1, 2, 3]) 

E mi metterò

[1, 2, 3, nil, nil] 

c'è un modo più semplice per farlo in ruby? Come espandere la dimensione attuale della matrice che ho già con oggetti nulli?

+1

Vuoi un nuovo array, o espandere un array esistente? Quale? – sawa

risposta

23
def fixed_array(size, other) 
    Array.new(size) { |i| other[i] } 
end 
fixed_array(5, [1, 2, 3]) 
# => [1, 2, 3, nil, nil] 
+0

Bello, userò il tuo codice, grazie :) – rorra

3
a = [1, 2, 3] 
b = a.dup 
Array.new(5){b.shift} # => [1, 2, 3, nil, nil] 

O

a = [1, 2, 3] 
b = Array.new(5) 
b[0...a.length] = a 
b # => [1, 2, 3, nil, nil] 

O

Array.new(5).zip([1, 2, 3]).map(&:last) # => [1, 2, 3, nil, nil] 

O

Array.new(5).zip([1, 2, 3]).transpose.last # => [1, 2, 3, nil, nil] 
9
5.times.collect{|i| other[i]} 
=> [1, 2, 3, nil, nil] 
5

C'è un modo più semplice per farlo in rubino? Come espandere la dimensione attuale della matrice che ho già con oggetti nulli?

Sì, è possibile espandere l'array corrente impostando l'ultimo elemento via Array#[]=:

a = [1, 2, 3] 
a[4] = nil # index is zero based 
a 
# => [1, 2, 3, nil, nil] 

Un metodo potrebbe assomigliare a questo:

def grow(ary, size) 
    ary[size-1] = nil if ary.size < size 
    ary 
end 

Si noti che questo modificherà il passato array.

1

È possibile anche effettuare le seguenti operazioni: (supponendo other = [1,2,3])

(other+[nil]*5).first(5) 
=> [1, 2, 3, nil, nil] 

se altro è [], si ottiene

(other+[nil]*5).first(5) 
=> [nil, nil, nil, nil] 
0

Simile alla risposta da @xaxxon, ma ancora più breve:

5.times.map {|x| other[x]} 

o

(0..4).map {|x| other[x]} 
0

questa risposta utilizza il metodo di fill

def fixed_array(size, other, default_element=nil) 
    _other = other 
    _other.fill(default_element, other.size..size-1) 
end 
Problemi correlati