読者です 読者をやめる 読者になる 読者になる

Ruby の Hash を値でソートして、次にキーでもソート

例えば点数を管理する hash があって、キーが氏名で、値がスコア。

score = { aaaa: 1, bb: 2, ba: 2, c: 3 }

ハイスコア順で並べて、氏名も ABC 順で並べたい。

下記では氏名が並ばない。ba, bb と並んでほしいよ。

p score.sort_by {|k, v| -v}
[[:c, 3], [:bb, 2], [:ba, 2], [:aaaa, 1]]

なのでこう。

p score.sort {|a, b| a[1] == b[1] ? a[0] <=> b[0] : b[1] <=> a[1] }
[:c, 3], [:ba, 2], [:bb, 2], [:aaaa, 1]]

「スコアが同じ ? 氏名順 : スコア順」 と分かりやすいけど、いつも忘れるのでメモ。

Ruby 以外の言語でこれを実装するときも方法を探すんだよね。公式ドキュメントに用法を載せてほしいコードの一つ。