次のコードを調べます。
arr = Array.new(3)
for i in 1..5
arr << i
end
これにより、3 つの空白行が出力され、その後に 1 ~ 5 の数字が続きます。
私がやろうとしているのは、変更できない設定サイズの配列を作成することです。これは、プッシュされると、0-index から最後までいっぱいになり、それを余分なもので上書きするだけで、出力がここでは数字の 1、2、5 のみになります。
これどうやってするの?
ああ、おっしゃる意味がわかります。
をサブクラス化する必要がありますArray
。このようなことをする必要があります。Array
たとえば、 のように、他のメソッドが適切に機能するように、より複雑なものを記述したい場合がありpush
ます。
class FixArray < Array
def initialize(max_size)
@max_size = max_size
super()
end
def << (v)
if self.size >= @max_size
self.pop(self.size - @max_size)
self[-1] = v
else
super(v)
end
self
end
end
farr = FixArray.new(3)
(1..5).each do |i|
farr << i
p farr
end
出力
[1]
[1, 2]
[1, 2, 3]
[1, 2, 4]
[1, 2, 5]
Range#to_aを使用します。
>> arr = (1..5).to_a
=> [1, 2, 3, 4, 5]
アップデート
arr = Array.new(3) # => [nil, nil, nil]
(1..5).each_with_index { |x, i|
arr[[i, arr.size - 1].min] = x
}
arr # => [1, 2, 5]
更新2
class FixArray < Array
def initialize(max_size)
@idx, @max_size = 0, max_size
super(max_size)
end
def << (v)
self[@idx] = v
@idx = [@idx + 1, @max_size - 1].min
self
end
end
arr = FixArray.new(3)
(1..5).each do |i|
arr << i
p arr
end
出力
[1, nil, nil]
[1, 2, nil]
[1, 2, 3]
[1, 2, 4]
[1, 2, 5]
Array.new(3)
は、3 つの要素が に設定された配列を作成しnil
ます。プッシュされたデータは、3 つの nil の後に追加されます。
配列を最小サイズにしたい場合は、すべてのデータを追加した後にプッシュしてください
arr = Array.new
for i in 1..5
arr << i
end
arr << nil while arr.size < 3
これにより、配列は に設定されたままになり[1, 2, 3, 4, 5]
ます。ループが1..2
代わりにある場合、それはそのままになり[1, 2, nil]
ます。
大きな配列で少し高速なものが必要な場合は、代わりにこれを使用して、必要なサイズに拡張します
arr += Array.new([0, 3 - arr.size].max)
次のようなこともできます:
max_size = 3
arr = []
(1..5).each do |x|
arr.pop if arr.size >= max_size
arr.push x
end
arrは
=> [1, 2, 5]
この動作のために新しいクラスを作成する必要はありません。
これと同じくらい簡単です.Ruby配列は自動的に展開され、それを押し進めると、常に配列の最後から始まり、それに追加されます.
arr = Array.new
アップデート
これを行うメソッドを作成します。
def replace_in_array(array, element)
array.replace([array.take(array.length - 1), element]).flatten
end
>> array = [1,2,3]
>> replace_in_array(array, 12)
>> [1,2,12]
この方法で配列を拡張できますが、常に最後のインデックスを取得して置き換えます。