and*_*aer 43 ruby multidimensional-array
也许这只是我缺乏在这里找到问题的能力,但我找不到任何关于如何在Ruby中创建多维数组的东西.
有人可以给我一个如何做的例子吗?
Veg*_*ger 41
严格地说,不可能在Ruby中创建多维数组.但是可以将数组放在另一个数组中,这与多维数组几乎相同.
这是你在Ruby中创建2D数组的方法:
a = [[1,2,3], [4,5,6], [7,8,9]]
Run Code Online (Sandbox Code Playgroud)
require 'narray'
b = NArray[ [1,2,3], [4,5,6], [7,8,9] ]
Run Code Online (Sandbox Code Playgroud)
使用a[i][j]访问数组中的元素.基本上a[i]返回存储在位置i上的"子数组" a,从而a[i][j]返回存储在位置上j的数组中的元素编号i.
Orl*_*ndo 22
你可以传递一个块 Array.new
Array.new(n) {Array.new(n,default_value)}
Run Code Online (Sandbox Code Playgroud)
返回块的值将是第一个数组的每个索引的值,
所以..
Array.new(2) {Array.new(2,5)} #=> [[5,5],[5,5]]
Run Code Online (Sandbox Code Playgroud)
并且您可以使用访问此数组 array[x][y]
同样对于第二个Array实例化,您也可以将块作为默认值传递.所以
Array.new(2) { Array.new(3) { |index| index ** 2} } #=> [[0, 1, 4], [0, 1, 4]]
Run Code Online (Sandbox Code Playgroud)
只是澄清一下:
arr = Array.new(2) {Array.new(2,5)} #=> [[5,5],[5,5]]
Run Code Online (Sandbox Code Playgroud)
与以下内容完全不同:
arr = Array.new(2, Array.new(2, 5))
Run Code Online (Sandbox Code Playgroud)
在后一种情况下,尝试:
arr[0][0] = 99
Run Code Online (Sandbox Code Playgroud)
这就是你得到的:
[[99,5], [99,5]]
Run Code Online (Sandbox Code Playgroud)
有两种方法可以初始化多数组(大小为2)。所有其他答案均显示带有默认值的示例。
声明每个子数组(可以在运行时中完成):
multi = []
multi[0] = []
multi[1] = []
Run Code Online (Sandbox Code Playgroud)
或在初始化时声明父数组的大小:
multi = Array.new(2) { Array.new }
Run Code Online (Sandbox Code Playgroud)
用法示例:
multi[0][0] = 'a'
multi[0][1] = 'b'
multi[1][0] = 'c'
multi[1][1] = 'd'
p multi # [["a", "b"], ["c", "d"]]
p multi[1][0] # "c"
Run Code Online (Sandbox Code Playgroud)
因此,您可以包装第一种方法并像这样使用它:
@multi = []
def multi(x, y, value)
@multi[x] ||= []
@multi[x][y] = value
end
multi(0, 0, 'a')
multi(0, 1, 'b')
multi(1, 0, 'c')
multi(1, 1, 'd')
p @multi # [["a", "b"], ["c", "d"]]
p @multi[1][0] # "c"
Run Code Online (Sandbox Code Playgroud)