【问题标题】:How to declare a two-dimensional array in Ruby如何在 Ruby 中声明一个二维数组
【发布时间】:2012-02-27 00:36:40
【问题描述】:

我想要一个 Ruby 中的二维数组,我可以像这样访问它:

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

问题是:我不知道数组维度的初始大小并且我增加了数组(使用<< 运算符)。

如何将它声明为实例变量,这样就不会出现这样的错误?

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

问题更新:

@array = Array.new {Array.new} 

现在对我有用,所以下面 Matt 的评论是正确的!

我刚刚发现收到错误的原因是因为我像这样迭代数组:

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] ...

【问题讨论】:

  • Ruby 使用动态类型——所以你不需要预先“声明”一个变量是一个二维数组。您可以做的是创建一个变量并将其初始化为一个数组。然后开始将数组放入其中。
  • for array = Array.new {Array.new} 需要改成array = Array.new(3) {Array.new(2)},里面需要有数字

标签: ruby arrays multidimensional-array matrix conways-game-of-life


【解决方案1】:

Ruby 的 Array 不提供此功能。

你要么手动做:

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

或者你使用哈希:

@hash = Hash.new{|h, k| h[k] = []}
@hash[42][3] = 42
@hash # => {42 => [nil, nil, nil, 42]}

【讨论】:

  • 我想到了使用哈希来编写 SparseArray 的想法。 Ruby方式手册中还有一个使用Hashes的示例实现。
【解决方案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

【讨论】:

  • 您可以通过向fetch 提供块来避免rescuehash.fetch(key){ hash[key] = {} } 会快得多。此外,hash[key] ||= {} 更短且更常用。
  • @Marc-AndréLafortune:注意:-)。获取和救援是不必要的。
  • 是否可以为每个维度设置一个 .length 方法?
  • @ka2011r:是的,请参阅更新的代码。此外,您还可以混合 Enumerable 模块并覆盖 #each 以获得更多功能。
【解决方案3】:

马特对您的问题的评论是完全正确的。但是,基于您已标记此“conways-game-of-life”这一事实,您似乎正在尝试初始化一个二维数组,然后在游戏计算中使用它。如果您想在 Ruby 中执行此操作,一种方法是:

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

这将创建一个填充零的 my_x_size * my_y_size 数组。

这段代码的作用是创建一个 x 大小的新数组,然后将该数组的每个元素初始化为另一个 y 大小的数组,并用 0 初始化每个第二个数组的每个元素。

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 2010-12-21
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 2013-08-12
    相关资源
    最近更新 更多