如何在Ruby中迭代部分哈希?

时间:2012-06-23 13:15:31

标签: ruby hash iterator

h = Hash.new
(1..100).each { |v| h.store(v * 2, v*v) }

在不使用密钥的情况下迭代哈希的给定部分的最佳方法是什么?例如,从元素10到元素20?使用Ruby 1.9.3。

编辑 - 回应戴夫的评论:
最初我想通过密钥访问数据(因此哈希)。但我也想按元素编号进行迭代。顺便说一句,每个元素都是哈希值。

那么,设计散列哈希值或哈希数组的最佳方法是什么,可以通过元素号迭代或通过键访问?数据如下所示。缺少日期。

6/23/2011 - > 5,6,8,3,6 6/26/2011 - > 6,8,4,8,5 6/27/2011 - > 8,4,3,2,7,

4 个答案:

答案 0 :(得分:4)

如果我理解你要求的内容,你可以按如下方式迭代哈希的一部分。这为您提供了第1001到第2000个值:

h.keys[1000..1999].each do |key|
    # Do something with h[key]
end

答案 1 :(得分:1)

我认为你最好使用Array(Ruby 1.9.3中的Hash是有序的,但访问方法是关键)。所以:

a = h.values
# or
a = h.to_a

答案 2 :(得分:1)

将其转换为数组,然后slice将其转换为

h.to_a[10..20].each { |k, v| do_stuff }

请注意,在Ruby 1.9之前,无法保证散列中元素的顺序,因此这不一定能够按预期工作。

或者,您可以使用each_with_index并跳过不需要的元素:

h.each_with_index do |(k, v), i|
  next unless (10..20).include?(i)
  # do stuff
end

答案 3 :(得分:1)

h = Hash.new
(1..100).each { |v| h.store(v * 2, v*v) }

#for an array of arrays
h.drop(9).take(10) #plus an optional block
#if the slice must be a hash:
slice = Hash[h.drop(9).take(10)]

但如果这是一个经常重复的操作,那么最好不要使用数据库。