0

Examine the following code:

arr = Array.new(3)
for i in 1..5
  arr << i
end

This outputs three blank lines, followed by the numbers 1 through 5.

What I'm trying to do is to create an array with a set size that cannot change, that, when pushed to, will fill up from 0-index to the last, and then just overwrite it with any extras, so that the output here will be just the numbers 1, 2 and 5.

How can I do this?

4

5 回答 5

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]
于 2013-08-02T09:10:56.747 回答
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]

更新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]
于 2013-08-02T08:51:32.187 回答
0
Array.new(3)

创建一个数组,其中三个元素设置为nil. 推送给它的任何数据都将在三个 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)
于 2013-08-02T08:56:42.070 回答
0

就这么简单,Ruby Array 会自动扩展,并且在向其推送时,它总是从 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]

这样你的数组可以扩展,但它总是会取最后一个索引并替换它。

于 2013-08-02T08:48:25.287 回答
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]

您不必为此行为创建新类。

于 2013-08-03T06:06:53.113 回答