2017-11-10 10 views
1

キーが数字で値が配列のハッシュを持っています。数字boundaryが与えられたら、私はハッシュの中でboundaryより大きいすべてのキーを調整したいと思います。"反復中に新しいキーをハッシュに追加できません"

私はこれを試してみました:

header_info_hash.each do |k, v| 
    if boundary < k 
    val = header_info_hash[k] 
    header_info_hash.delete(k) 
    header_info_hash[k-1] = val 
    end 
end 

が、それはエラーが発生します。

RuntimeError: can't add a new key into hash during iteration 

これを行うための簡単な方法は何ですか?私はこのデータ構造を新しいものに変更するのではなく、このデータ構造を変更したいと思います。

+2

「すべてのキーを調整する」という言葉はまったく明確ではありません。 – sawa

+0

私はそれを逃した。私は実際にあなたがなぜそれを取り除いたのだろうと思っていました。それを取り除いた。 – sawa

+1

@sawa:非常に同じタグの説明は、私たちが '[ruby-hash]'を使うことを示唆しています。 –

答えて

3

What is an easier way to do this?

反復処理しているコレクションを決して変更しないでください。 (あなたがなぜそれをしなければならないのか正確に分からない限り)。その代わりに、コレクションをクローン/ダンプします。あなたは今、同じものの2つのコピーを持っています。 1つを反復しますが、他のを変更してください。

完了したら、オリジナルを変更したコピーと置き換えます(オプション、要件に応じて)。

この場合、ハッシュを反復してから削除する必要はありません。すべてのキーが既に "調整"されている(それが意味するものはすべて)、新しいハッシュを作成することができます。

new_header_info_hash = header_info_hash.each_with_object({}) do |(k, v), result| 
    if boundary < k 
    result[k-1] = v 
    else 
    result[k] = v 
    end 
end 
+1

OPの大きな間違いを犯して 'header_info_hash [k]'を呼び出すのは、なぜ単純に 'v'と書くことができるのですか? – sawa

+0

@sawa:ああ、ちょっとしたコードを読まずに正式な変換を適用しました。 :)ありがとう。 –

+1

キーが条件を満たさなくても、新しいハッシュに値を割り当てる必要があると思います。 – sawa

関連する問題