2010-09-29 112 views
3

如何将散列中的范围传递以从索引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 

任何更好的方法来解决这个问题??

+0

你想要发生什么?您可能只需要一个算法,它会生成一些散列值(基本上这是一个数学函数),并给出一些值。因此,对于字符串,您可以将字符串%质数中的所有ASCII值*位置相加。 – 2010-09-29 17:43:02

回答

7

在Ruby 1.9只:

给定一个哈希:

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

是这样的:

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

这将通过以下哈希{ :c => :d, :e => f }作为第一个键/值对迭代被排除在范围之外。

2

哈希没有秩序的概念。不存在散列中的第一个或第二个元素。

所以你不能做你想要的哈希值。

0

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

另一方面,你会得到一个错误,因为哈希实例中的方括号接受键。因此,如果你的散列不包含1..-1作为一个关键 - 你将得到零值和零不响应each_pair。试试这个以得到这个:

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

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

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

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