2017-08-08 8 views
0

ハッシュ内のキー値のペアの位置が固定されていないと聞き、再配置できると聞きました。Ruby(または任意の言語)のハッシュでのキー/値ペアの位置

私はこれが本当かどうか知りたいのですが、そうであれば、誰かが私にいくつかのドキュメントを教えることができますか?それが間違っていれば、逆の証拠があることは素晴らしいことです。説明するために

私は、次のハッシュ持っている場合、:

NUMBERS = { 
      1000 => "M", 
      900 => "CM", 
      500 => "D", 
      400 => "CD", 
      100 => "C", 
      90 => "XC", 
      50 => "L", 
      40 => "XL", 
      10 => "X", 
      9 => "IX", 
      5 => "V", 
      4 => "IV", 
      1 => "I", 
      } 

と何度も繰り返し、それを反復処理し、最初のキー/値のペアは、おそらく1000 => 'M'のではないでしょうか?または、キー/値のペアの位置が定義によって固定されていて、ポジションを変更するために手動で変更する必要がありますか?

この質問は、ハッシュの性質に関するより一般的かつ基本的な質問です。私はハッシュの特定の位置に到達する方法を尋ねていません。

+0

可能な複製を(https://stackoverflow.com/question/12155383/how-to-get-hash-values-by-position in-ruby) –

+1

その質問と重複しているとは思わないが、おそらくこれと重複しているhttps://stackoverflow.com/questions/31418673/is-of-a ruby​​-hash-literal-guaranteed –

答えて

2

一般的にハッシュ(または辞書、連想配列など)は、順序付けられていないデータ構造と見なされます。

またWikipedia

から、連想配列は そのようなバインディングの数を決定するか、すべてのバインディング上 ループに反復子を構築するなど、他の操作をも含むことができます。通常、このような操作の場合、バインディングが返される の順序は任意です。

しかし、Ruby 1.9以降、ハッシュキーはRubyに挿入された順序を維持します。

答えが正しいRuby documentation for Hash

ハッシュの上部にある、対応するキー が挿入された順序でそれらの値を列挙する。

あなたはかなり簡単にそれを自分でテストすることができRubyで

key_indices = { 
    1000 => 0, 
    900 => 1, 
    500 => 2, 
    400 => 3, 
    100 => 4, 
    90 => 5, 
    50 => 6, 
    40 => 7, 
    10 => 8, 
    9 => 9, 
    5 => 10, 
    4 => 11, 
    1 => 12 
} 

1_000_000.times do 
    key_indices.each_with_index do |key_val, i| 
    raise if key_val.last != i 
    end 
end 
1

(も連想配列と呼ばれる)のハッシュは、順序付けられていないデータ構造です。 Ruby 1.9 Rubyは挿入されたキーの順序を保持しています。

あなたはここにこのことについて全体の多くを見つけることができます[?ルビーに位置によってハッシュ値を取得する方法] Is order of a Ruby hash literal guaranteed?

そして、いくつかのここhttps://ruby-doc.org/core-2.4.1/Hash.html

関連する問題