web-dev-qa-db-ja.com

Rubyのハッシュの値による降順ソート

私の入力ハッシュ:h = { "a" => 20, "b" => 30, "c" => 10 }

昇順ソート:h.sort {|a,b| a[1]<=>b[1]} #=> [["c", 10], ["a", 20], ["b", 30]]

しかし、私は[["b", 30], ["a", 20], ["c", 10]]が必要です

<=>はどういう意味ですか?

66
zengr

あなたはそれを一度に、よりきれいに、より明確に、より速くすることができます!このような:

h.sort_by {|k,v| v}.reverse

1000要素のハッシュをランダムな値でソートする3000回の繰り返しでタイミングのベンチマークを行い、次の時間を取得しました。

h.sort {|x,y| -(x[1]<=>y[1])} -- 16.7s
h.sort {|x,y| y[1] <=> x[1]} -- 12.3s
h.sort_by {|k,v| -v} -- 5.9s
h.sort_by {|k,v| v}.reverse -- 3.7
173
glenn mcdonald
h.sort {|a,b| b[1]<=>a[1]}
11
demas

_<=>_は2つのオペランドを比較し、最初のオペランドが小さい場合は-1、等しい場合は0、最初のオペランドが大きい場合は1を返します。つまり、-(a[1]<=>b[1])を実行するだけで順序を逆にすることができます。

9
Chuck

超シンプル:h.sort_by { |k, v| -v }

7
Paul Odeon