0

次のコードを調べます。

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

これにより、3 つの空白行が出力され、その後に 1 ~ 5 の数字が続きます。

私がやろうとしているのは、変更できない設定サイズの配列を作成することです。これは、プッシュされると、0-index から最後までいっぱいになり、それを余分なもので上書きするだけで、出力がここでは数字の 1、2、5 のみになります。

これどうやってするの?

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)

は、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)
于 2013-08-02T08:56:42.070 に答える
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 に答える
0

これと同じくらい簡単です.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]

この方法で配列を拡張できますが、常に最後のインデックスを取得して置き換えます。

于 2013-08-02T08:48:25.287 に答える