首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Ruby中创建二维数组和访问子数组

在Ruby中创建二维数组和访问子数组
EN

Stack Overflow用户
提问于 2009-11-12 17:12:57
回答 9查看 148.7K关注 0票数 74

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

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

代码语言:javascript
复制
x = Array.new(10) { Array.new(20) }

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

但据我所知,我们不能这样访问它:

代码语言:javascript
复制
x[3..8][6]

我如何避免或破解这一限制?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-11-12 19:54:19

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

代码语言:javascript
复制
a= [[1,2],[3,4]]
a[0][2]= 5 # works
a[2][0]= 6 # error

作为ArrayHash

对于多维Arrays,我更喜欢使用Hashes

代码语言:javascript
复制
a= Hash.new
a[[1,2]]= 23
a[[5,6]]= 42

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

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

代码语言:javascript
复制
a= Hash.new(0)

现在我们来看看如何获得子数组

代码语言:javascript
复制
(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时,我会三思而后行。

票数 102
EN

Stack Overflow用户

发布于 2009-11-12 17:19:29

代码语言:javascript
复制
rows, cols = x,y  # your values
grid = Array.new(rows) { Array.new(cols) }

至于访问元素,这篇文章非常适合用您想要的方式逐步封装数组:

How to ruby array

票数 40
EN

Stack Overflow用户

发布于 2009-11-12 20:29:09

你没有陈述你的实际目标,但这可能会有所帮助:

代码语言:javascript
复制
require 'matrix'  # bundled with Ruby
m = Matrix[
 [1, 2, 3],
 [4, 5, 6]
]

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

(向量的作用类似于数组)

或者,根据您的需要使用类似的符号:

代码语言:javascript
复制
m.minor(0..1, 2..2) # => Matrix[[3], [6]]
票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1720932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档