2010-09-29 91 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#[]方法輕鬆將其轉換爲散列。