我想知道是否有可能创建一个二维数组并快速访问其中的任何水平或垂直子数组?
我相信在下面的情况下我们可以访问一个水平子数组:
x = Array.new(10) { Array.new(20) }
x[6][3..8] = 'something'
但据我所知,我们不能这样访问它:
x[3..8][6]
我如何避免或破解这一限制?
发布于 2009-11-12 19:54:19
2维Arrays
的实现方式存在一些问题。
a= [[1,2],[3,4]]
a[0][2]= 5 # works
a[2][0]= 6 # error
作为Array
的Hash
对于多维Arrays
,我更喜欢使用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
变得太大时,可能会出现问题。因此,如果我知道我的数据量越来越大,那么在实现这样的多维Array
时,我会三思而后行。
发布于 2009-11-12 17:19:29
rows, cols = x,y # your values
grid = Array.new(rows) { Array.new(cols) }
至于访问元素,这篇文章非常适合用您想要的方式逐步封装数组:
发布于 2009-11-12 20:29:09
你没有陈述你的实际目标,但这可能会有所帮助:
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]]
https://stackoverflow.com/questions/1720932
复制相似问题