如何在Ruby中声明二维数组

前端之家收集整理的这篇文章主要介绍了如何在Ruby中声明二维数组前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在 Ruby中使用二维数组,我可以像下面这样访问:
  1. if @array[x][y] == "1" then @array[x][y] = "0"

问题是:我不知道数组维度的初始大小,并且我增长了数组(使用<<运算符). 如何将其声明为实例变量,所以我没有这样的错误

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

问题更新:

  1. @array = Array.new {Array.new}

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

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

  1. for i in 0..@array.length
  2. for j in 0..@array[0].length
  3. @array[i][j] ...

这显然是错误的,并产生了错误.必须是这样的:

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

解决方法

使用嵌套Hashes的稀疏二维数组的简单实现,
  1. class SparseArray
  2. attr_reader :hash
  3.  
  4. def initialize
  5. @hash = {}
  6. end
  7.  
  8. def [](key)
  9. hash[key] ||= {}
  10. end
  11.  
  12. def rows
  13. hash.length
  14. end
  15.  
  16. alias_method :length,:rows
  17. end

用法

  1. sparse_array = SparseArray.new
  2. sparse_array[1][2] = 3
  3. sparse_array[1][2] #=> 3
  4.  
  5. p sparse_array.hash
  6. #=> {1=>{2=>3}}
  7.  
  8. #
  9. # dimensions
  10. #
  11. sparse_array.length #=> 1
  12. sparse_array.rows #=> 1
  13.  
  14. sparse_array[0].length #=> 0
  15. sparse_array[1].length #=> 1

猜你在找的Ruby相关文章