2013-05-30 10 views
9

Chcę utworzyć stałą tablicę size z domyślną liczbą elementów już wypełnione z innej tablicy, więc powiedzmy, że mam tą metodą:Utwórz tablicę o stałym rozmiarze i wypełnij domyślną zawartość inną tablicą?

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

Więc mogę użyć metody takie jak:

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

I będę się

[1, 2, 3, nil, nil] 

Czy istnieje łatwiejszy sposób to zrobić w Ruby? Jak rozszerzenie bieżącego rozmiaru tablicy, którą już mam z obiektami zerowymi?

+1

Chcesz nową tablicę lub rozszerzyć istniejącą tablicę? Który? – sawa

Odpowiedz

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

Fajnie, użyję twojego kodu, thx :) – rorra

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

Albo

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

Albo

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

Albo

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

Czy jest to łatwiejszy sposób w ruby? Jak rozszerzenie bieżącego rozmiaru tablicy, którą już mam z obiektami zerowymi?

Tak, można poszerzyć swoją aktualną tablicę poprzez ustawienie ostatniego elementu poprzez Array#[]=:

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

metoda mogłaby wyglądać następująco:

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

Należy pamiętać, że będzie to zmodyfikować przekazany szyk.

1

Można również wykonać następujące czynności: (zakładając other = [1,2,3])

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

jeśli drugi jest [], można uzyskać

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

podobna do odpowiedzi przez @xaxxon, ale nawet krótszy:

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

lub

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

ta odpowiedź wykorzystuje fill metoda

def fixed_array(size, other, default_element=nil) 
    _other = other 
    _other.fill(default_element, other.size..size-1) 
end 
Powiązane problemy