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

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

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

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

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

x[3..8][6]

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

推荐答案

二维Arrays的实现方式存在一些问题.

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

Hash as Array

我更喜欢用Hashes来表示多维Arrays

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] }

在O(n)中运行(a..b).to_a次.从Hash中检索一个元素几乎是O(1),因此collect几乎以O(n)的形式运行.没有办法使它比O(n)快,因为复制n个元素总是O(n).

当他们变得太大时,Hashes人可能会有问题.所以,如果我知道自己的数据量越来越大,我会三思而后行,实现这样一个多维Array.

Ruby相关问答推荐

每秒做某事 x 次

碰撞检测测试中对象的 Nil 类

数组切片中没有左边框的Ruby范围

当没有传入块时,是否有更好的方法来防止屈服?

检测 ruby​​ 是否在 Windows 上运行的正确方法是什么?

我可以在 Ruby 中使用默认值创建一个数组吗?

Coffeescript 中等效的 Ruby .times

从索引到字符串结尾的子字符串的Ruby成语

如何获取字符串中所有出现的 Ruby 正则表达式的匹配数据?

根据另一个数组的元素对数组进行排序

C# ?? Ruby 中的运算符?

如何从 SystemStackError 中获取回溯:堆栈级别太深?

野外的好黄瓜例子?

判断ruby中的字符长度

如何在 Ruby 中重命名文件?

如何在 Rails 3 迁移中描述枚举列?

如何在 Ruby 中使用全局变量或常量值?

严格将字符串转换为整数(或 nil)

如何创建一个 Gemfile?

查找模块中可用的类