迭代特定范围的哈希值

时间:2010-09-29 17:34:25

标签: ruby hash

如何传递散列范围以从索引1到最后一次迭代?

h = {}

h[1..-1].each_pair do |key,value|
  puts "#{key} = #{value}
end

此代码返回错误。我怎么可以在哈希中传递范围?

编辑:

我想打印第一个键和值而不进行任何计算。

从第二个键和值我想对哈希值进行一些计算。

为此,我写了这段代码......     store_content_in_hash包含键和值。

first_key_value = store_content_in_hash.shift
f.puts first_key_value[1]
f.puts
store_content_in_hash.each_pair do |key,value|
  store_content_in_hash[key].sort.each {|v| f.puts v }
  f.puts
end

有什么更好的方法可以解决这个问题吗?

4 个答案:

答案 0 :(得分:8)

仅限Ruby 1.9:

给出哈希:

h = { :a => :b, :c => :d, :e => :f }

Go like this:

Hash[Array(h)[1..-1]].each_pair do |key, value|
    # ...
end

这会迭代以下哈希{ :c => :d, :e => f },因为第一个键/值对被范围排除。

答案 1 :(得分:2)

哈希没有秩序的概念。哈希中没有第一个或第二个元素。

所以你不能用哈希来做你想做的事。

答案 2 :(得分:0)

哈希与范围无关。这是关键值对。在ruby 1.8中,散列是无序的,因此你无法确定键和值将以哪种顺序迭代,使“范围”的东西过时。而且我相信你在这种情况下做错了什么。你能详细说明你的问题吗?

另一方面,您收到错误,因为Hash实例中的方括号接受键。因此,如果您的哈希值不包含1..-1作为键 - 您将获得nil值,而nil不会响应each_pair。试试这个来抓住这个:

h = {(1..-1) => {:foo => :bar}}

h[1..-1].each_pair do |key,value| 
  puts "#{key} = #{value}"
end

答案 3 :(得分:0)

正如其他人所指出的,哈希不是关于秩序的。确实,1.9哈希是有序的,但这只是一个方便,而不是它们的主要特征。

如果订单对您很重要,只需使用数组而不是哈希值。在您的情况下,一对数组(双元素数组)似乎符合目的。如果您需要通过密钥访问它,您可以使用Hash#[]方法轻松将其转换为哈希值。