我正在编写一个程序来“纠正”我当前的哈希值。我有一个哈希,他的键值对只有一个“关闭”。这是不正确的哈希:
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 |之类的东西
我是新手,所以非常感谢任何帮助!!
答案 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 }
)来确定两个哈希共享的每个密钥的值,这里是所有密钥。