ruby noob:散列是快速且最适合存储的还是我应该创建一个元组?

ruby noob:散列是快速且最适合存储的还是我应该创建一个元组?,ruby,optimization,Ruby,Optimization,这是一个非常简单的问题,我正在用Ruby解决,但我完全是个傻瓜,所以我想学习最正确的解决方案。我有一个包含名称和值的数据列表。我需要记住所有这些(显而易见的答案:散列)。但是,我还需要记住这些数据的顺序。所以它看起来像: x=1 y=2 z=3 我在考虑制作一个由1个元素散列组成的数组: [0 => {'x' => 1}, 1 => {'y' => 2}, 2 => {'z' => 3}] 在这种情况下,哈希是最佳选择吗?有什么原因导致它们速度慢,或者

这是一个非常简单的问题,我正在用Ruby解决,但我完全是个傻瓜,所以我想学习最正确的解决方案。我有一个包含名称和值的数据列表。我需要记住所有这些(显而易见的答案:散列)。但是,我还需要记住这些数据的顺序。所以它看起来像:

x=1
y=2
z=3
我在考虑制作一个由1个元素散列组成的数组:

[0 => {'x' => 1},
 1 => {'y' => 2},
 2 => {'z' => 3}]

在这种情况下,哈希是最佳选择吗?有什么原因导致它们速度慢,或者不是最优的吗?

使用Ruby 1.9。散列在这里排序。

使用Ruby 1.9。散列在这里排序。

您可以尝试使用Ruby Facets从
ActiveSupport
Dictionary
使用Ruby Facets进行排序。

您可以尝试使用Ruby Facets从
ActiveSupport
Dictionary
进行排序。

如果性能允许,关联数组可以工作。关联数组是数组的数组,每个子数组包含两个元素:

a = [
  [:x, 1],
  [:y, 2],
  [:z, 3],
]
您可以使用
assoc
按第一个元素查找子数组:

p a.assoc(:x)         # [:x, 1]
p a.assoc(:x).last    # 1
p a.rassoc(2)          # [:y, 2]
p a.rassoc(2).first    # :y
rassoc
按最后一个元素查找子数组:

p a.assoc(:x)         # [:x, 1]
p a.assoc(:x).last    # 1
p a.rassoc(2)          # [:y, 2]
p a.rassoc(2).first    # :y
这种方法是否适用于您取决于列表的大小以及您必须搜索它的频率。在我的机器上,查找1000个元素列表中的最后一个元素大约需要100微秒



另一种方法是使用普通的无序数组(在Ruby性能允许的情况下,关联数组可以工作。关联数组是数组的数组,每个子数组包含两个元素:

a = [
  [:x, 1],
  [:y, 2],
  [:z, 3],
]
您可以使用
assoc
按第一个元素查找子数组:

p a.assoc(:x)         # [:x, 1]
p a.assoc(:x).last    # 1
p a.rassoc(2)          # [:y, 2]
p a.rassoc(2).first    # :y
rassoc
按最后一个元素查找子数组:

p a.assoc(:x)         # [:x, 1]
p a.assoc(:x).last    # 1
p a.rassoc(2)          # [:y, 2]
p a.rassoc(2).first    # :y
这种方法是否适用于您取决于列表的大小和搜索频率。在我的机器上,查找1000个元素列表中的最后一个元素大约需要100微秒



另一种方法是使用简单、无序的(在Ruby中值得注意的是,如果Ruby 1.8是必需的,
ActiveSupport
中的
OrderedHash
只会在Ruby版本小于1.9时扩展哈希,因此仅使用
OrderedHash
进行良好的度量不会带来严重的性能问题。值得注意的是,如果Ruby 1.8是必需的,
OrderedHash
中的
ActiveSupport仅在Ruby版本低于1.9时才会扩展哈希,因此仅使用
OrderedHash
进行良好的度量不会带来严重的性能问题。