7

たとえば次のようにアクセスできるRubyの2次元配列が必要です。

if @array[x][y] == "1" then @array[x][y] = "0"

問題は次のとおりです。配列の次元の初期サイズがわからないので、(<<演算子を使用して)配列を拡張します。

インスタンス変数として宣言するにはどうすればよいので、このようなエラーは発生しませんか?

undefined method `[]' for nil:NilClass (NoMethodError)

更新された質問:

@array = Array.new {Array.new} 

今は私のために働いているので、以下のマットからのコメントは正しいです!

エラーが発生した理由は、次のように配列を繰り返し処理したためです。

for i in 0..@array.length
    for j in 0..@array[0].length
        @array[i][j] ...

これは明らかに間違っていて、エラーを引き起こしました。次のようにする必要があります。

for i in 0..@array.length-1
        for j in 0..@array[0].length-1
            @array[i][j] ...
4

3 に答える 3

7

ネストされたハッシュを使用したスパース2次元配列の簡単な実装。

class SparseArray
  attr_reader :hash

  def initialize
    @hash = {}
  end

  def [](key)
    hash[key] ||= {}
  end

  def rows
    hash.length   
  end

  alias_method :length, :rows
end

使用法:

sparse_array = SparseArray.new
sparse_array[1][2] = 3
sparse_array[1][2] #=> 3

p sparse_array.hash
#=> {1=>{2=>3}}

#
# dimensions
#
sparse_array.length    #=> 1
sparse_array.rows      #=> 1

sparse_array[0].length #=> 0
sparse_array[1].length #=> 1
于 2012-02-04T22:21:08.340 に答える
5

あなたの質問に対するマットのコメントは完全に正しいです。ただし、この「conways-game-of-life」にタグを付けたという事実に基づくと、2次元配列を初期化してから、これをゲームの計算に使用しようとしているようです。Rubyでこれを実行したい場合、これを実行する1つの方法は次のとおりです。

a = Array.new(my_x_size) { |i| Array.new(my_y_size) { |i| 0 }}

これにより、ゼロで満たされたmy_x_size*my_y_size配列が作成されます。

このコードは、xサイズの新しい配列を作成し、その配列の各要素をyサイズの別の配列に初期化し、2番目の配列の各要素を0で初期化します。

于 2012-02-05T04:28:49.553 に答える
3

RubyArrayはこの機能を提供しません。

手動で行うか、次のようにします。

(@array[x] ||= [])[y] = 42

または、ハッシュを使用します。

@hash = Hash.new{|h, k| h[k] = []}
@hash[42][3] = 42
@hash # => {42 => [nil, nil, nil, 42]}
于 2012-02-04T21:59:27.637 に答える