Ruby 有没有一种方法可以用索引值遍历散列?

Ruby 有没有一种方法可以用索引值遍历散列?,ruby,indexing,hash,iteration,key-value,Ruby,Indexing,Hash,Iteration,Key Value,我正在编写一个程序来“更正”我拥有的当前哈希。我有一个散列,它的键值对只有一个“关”。这是不正确的哈希: wrong_hash = {:a => "banana", :b => "cabbage", :c => "dental_floss", :d => "eel_sushi”} :c需要与“卷心菜”配对, :b需要与“香蕉”配对 等 这就是我目前所拥有的。创建变量新项目时遇到问题 def hash_correct(hash) correct_hash = {}

我正在编写一个程序来“更正”我拥有的当前哈希。我有一个散列,它的键值对只有一个“关”。这是不正确的哈希:

wrong_hash = {:a => "banana", :b => "cabbage", :c => "dental_floss", :d => "eel_sushi”}
:c需要与“卷心菜”配对, :b需要与“香蕉”配对 等

这就是我目前所拥有的。创建变量
新项目时遇到问题

def hash_correct(hash)
 correct_hash = {}

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

return correct_hash

end
def散列\u正确(散列)
正确的_散列={}
hash.each do |键,项|
新项目=

正确的\u hash
每个\u 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"}
有一种方法,用于哈希的方法如下所示:

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"}

它使用的形式是使用一个块(
{values.shift}
)来确定被合并的两个哈希共享的每个键的值,这里是所有键。

什么是正确的哈希对规则?@Ilya基本上,构建原始哈希的人对每个哈希对都是“一次性的”。因此,索引0“banana”处的值实际上应该是索引1(:b)的值。索引1“colla”的值应该与索引2的键配对:当你提出一个有效的问题时,这个问题的更像ruby的解决方案不需要显式的迭代,而是使用
map
这样:
错误的hash.map{k,v |[k.succ,v]},这是一个很好的解决方法,确实非常像红宝石。在这种情况下,它可以完美地工作。但是,如果这个人真的破坏了原始散列,并将键写为::1st:2nd:3rd(或类似的东西),那么这就行不通了?索引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"}