[Ruby]ハッシュ(Hash)の要素をランダムにソートするには?

Ruby

どうも、ちょげ(@chogetarou)です。

sampleメソッドでハッシュ(Hash)をランダムに並び替えてシャッフルする方法を紹介します。

スポンサーリンク

方法

sampleメソッドでハッシュ(Hash)をランダムに並び替えてシャッフルする方法は、2つあります。

sortメソッド

ひとつは、sortメソッドを使う方法です。

まず、ハッシュのsortメソッドを呼び出します。

sortメソッドのブロックに「|a, b| rand <=> rand」を指定します。

そして、sortメソッドからto_hメソッドを呼び出します。

#hash=対象のハッシュ
result = hash.sort {|a, b| rand <=> rand }.to_h    

上記のto_hメソッドは、対象のハッシュ(Hash)をランダムにソートした結果を返します。

使用例

nums = { 
    "one" => 1, 
    "two" => 2,
    "three" => 3,
    "four" => 4,
    "five" => 5,
}

result = nums.sort {|a, b| rand <=> rand }.to_h

p result
出力:
{"four"=>4, "five"=>5, "three"=>3, "one"=>1, "two"=>2}

sampleメソッド

もうひとつは、sampleメソッドを使う方法です。

まず、Hash[]を記述します。

[]内で、ハッシュからto_aメソッド、to_aメソッドからsampleメソッドを呼び出します。

そして、sampleメソッドの引数にハッシュから呼び出したlengthメソッドの結果を指定します。

#h=対象のハッシュ
result = Hash[h.to_a.sample(h.length)]

上記のHash[]は、対象のハッシュ(Hash)をランダムにソートした結果を生成します。

使用例

nums = { 
    "one" => 1, 
    "two" => 2,
    "three" => 3,
    "four" => 4,
    "five" => 5,
}

result = Hash[nums.to_a.sample(nums.length)]

p result
出力:
{"four"=>4, "two"=>2, "three"=>3, "five"=>5, "one"=>1}

まとめ

sampleメソッドでハッシュ(Hash)をランダムに並び替えてシャッフルする方法は、次の2つです。

  • sortメソッドを使う方法
    result = hash.sort {|a, b| rand <=> rand }.to_h
  • detectメソッドを使う方法
    result = Hash[h.to_a.sample(h.length)]

コメント

タイトルとURLをコピーしました