怎么在Ruby中创建二维数组并访问子数组?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我想知道是否有可能创建一个二维数组并快速访问其中的任何水平或垂直子数组?

我相信我们可以在以下情况下访问水平子数组:

x = Array.new(10) { Array.new(20) }

x[6][3..8] = 'something'

但据我了解,我们无法像这样访问它:

x[3..8][6]

我怎样才能避免或破解这个限制?

提问于
用户回答回答于

2维Arrays的实现方式存在一些问题。

a= [[1,2],[3,4]]
a[0][2]= 5 # works
a[2][0]= 6 # error

hash作为数组

我更喜欢Hashes用于多维数组

a= Hash.new
a[[1,2]]= 23
a[[5,6]]= 42

这样做的好处是,不必手动创建列或行。插入散列几乎是O(1),所以没有缺点,只要Hash不会变得太大。

甚至可以为所有未指定的元素设置默认值

a= Hash.new(0)

获得子阵列:

(3..5).to_a.product([2]).collect { |index| a[index] }
[2].product((3..5).to_a).collect { |index| a[index] }

(a..b).to_a在O(n)中运行。从一个元素中检索一个元素Hash几乎是O(1),所以这个集合几乎在O(n)中运行。没有办法让它比O(n)更快,因为拷贝n个元素总是O(n)。

Hashes当他们变得太大时可能会有问题。因此对于数组,如果我知道我的数据量越来越大,我会考虑实施这样的多维度。

用户回答回答于

你没有说明你的实际目标,但也许这可以帮助:

require 'matrix'  # bundled with Ruby
m = Matrix[
 [1, 2, 3],
 [4, 5, 6]
]

m.column(0) # ==> Vector[1, 4]

或者,使用想要的类似符号:

m.minor(0..1, 2..2) # => Matrix[[3], [6]]

扫码关注云+社区