有没有办法迭代索引值的哈希?

时间:2016-05-30 17:59:41

标签: ruby indexing hash iteration key-value

我正在编写一个程序来“纠正”我当前的哈希值。我有一个哈希,他的键值对只有一个“关闭”。这是不正确的哈希:

wrong_hash = {:a => "banana", :b => "cabbage", :c => "dental_floss", :d => "eel_sushi”}

:c需要与“白菜”配对, :b需要与“香蕉”配对 等

这是我到目前为止所拥有的。我在创建变量new_item

时遇到问题
def hash_correct(hash)
 correct_hash = {}

 hash.each do |key, item|
 new_item = 
  correct_hash << hash[key] = new_item
end

return correct_hash

end

注意:我的兴趣不仅仅是获得正确的答案,我理解还有其他方法可以解决它(排序,循环等)我只想知道是否有办法包括我块中的索引变量。像| key,item,index |之类的东西

我是新手,所以非常感谢任何帮助!!

3 个答案:

答案 0 :(得分:4)

Enumerable#each_with_index方法,哈希将像这样使用:

hash.each_with_index { |(k, v), i| ... }

但是,您可以使用

解决您的特定问题
wrong_hash.keys.drop(1).zip(wrong_hash.values).to_h
# => {:b=>"banana", :c=>"cabbage", :d=>"dental_floss"}

答案 1 :(得分:1)

each_cons对此很好:

wrong_hash = {:a => "banana", :b => "cabbage", :c => "dental_floss", :d => "eel_sushi"}

right_hash = {}
wrong_hash.each_cons(2){|(_, v1),(k2, _)| right_hash[k2] = v1}
p right_hash # => {:b=>"banana", :c=>"cabbage", :d=>"dental_floss"}

答案 2 :(得分:0)

values = wrong_hash.values.unshift(nil)
  #=> [nil, "banana", "cabbage", "dental_floss", "eel_sushi"] 
wrong_hash.merge(wrong_hash) { values.shift }
  #=> {:a=>nil, :b=>"banana", :c=>"cabbage", :d=>"dental_floss"} 

这使用Hash#merge的形式,它使用一个块({ values.shift })来确定两个哈希共享的每个密钥的值,这里是所有密钥。