检查以下代码:
arr = Array.new(3)
for i in 1..5
arr << i
end
这将输出三个空行,然后是数字1到5。
我尝试做的是创建一个具有无法更改的设置大小的数组,当推送到该数组时,将从0索引填充到最后一个,然后用任何额外的内容覆盖它,这样输出就是数字1,2和5。
我该怎么做?
答案 0 :(得分:2)
您需要继承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]
答案 1 :(得分:1)
使用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]
<强> UPDATE2 强>
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]
答案 2 :(得分:0)
就像这一样简单,Ruby Array会自动扩展,当推送到它时,它总是从数组的末尾开始并追加到它。
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]
这样你的数组就可以扩展,但它总会占用最后一个索引并替换它。
答案 3 :(得分:0)
Array.new(3)
创建一个数组,其中三个元素设置为nil
。推送到它的任何数据都将在三个nils之后添加。
如果您希望阵列的大小最小,请在添加完所有数据后将其推送到
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)
答案 4 :(得分:0)
您也可以这样做:
max_size = 3
arr = []
(1..5).each do |x|
arr.pop if arr.size >= max_size
arr.push x
end
arr是
=> [1, 2, 5]
您不必为此行为创建新类。