Ruby多维数组

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)


如评论中所述,您还可以使用NArray,这是一个Ruby数值数组库:

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.

  • 作为替代(对于科学计算/密集数据),考虑NArray或编码方法. (6认同)
  • 重要的是要注意访问它的语法是`a [1] [2] [1]`而不是某些人可能期望的`a [1,2,1]`. (3认同)

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)


Xav*_*rac 7

只是澄清一下:

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)


Evm*_*rov 5

有两种方法可以初始化多数组(大小为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)