2010-09-29 8 views
3

Как пройти диапазон в хеш-итерации от индекса 1 до последнего?Iterate hash для определенного диапазона

h = {} 

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

Этот код возвращает ошибку. как я могу пройти диапазон в хэш ??

EDIT:

Я хочу напечатать первый ключ и значение без каких-либо расчетов.

От второго ключа и значения я хочу сделать некоторые вычисления на моем хэше.

Для этого я написал этот код ... 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 * в строковое число простых чисел. –

ответ

7

В Ruby 1.9 только:

Учитывая хэш:

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

Go Как это:

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

Это будет перебирать следующий хэш { :c => :d, :e => f } в качестве первой пары ключей/значений исключается диапазоном.

2

Хеши не имеют концепции порядка. В хеше не существует такого элемента, как первый или второй элемент.

Таким образом, вы не можете делать то, что хотите, с помощью хэшей.

0

Хеш не о диапазонах. Речь идет о парах ключевых значений. В рубине 1.8 хэш неупорядочен, поэтому вы не можете быть уверены, в каком порядке будут повторяться ключи и значения, из-за которых «диапазон» устарел. И я считаю, что вы делаете что-то не так (tm) в этой ситуации. Можете ли вы подробно остановиться на своей проблеме?

С другой стороны, вы получаете сообщение об ошибке, поскольку квадратные скобки в экземпляре Hash принимают ключи. Поэтому, если ваш хеш не содержит 1..-1 в качестве ключа - вы получите нулевое значение, а nil не ответит на each_pair. Попробуйте сделать это, чтобы это удержать:

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

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

Как указывали другие, хеши не о порядке. Верно, что 1,9 хэша заказаны, но это просто удобство, а не их основная особенность.

Если заказ важен для вас, просто используйте массивы вместо хешей. В вашем случае массив пар (двухэлементных массивов), похоже, соответствует цели. И если вам нужно получить к нему доступ по ключу, вы всегда можете легко преобразовать его в хэш, используя метод Hash#[].

Смежные вопросы