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 以外の言語でこれを実装するときも方法を探すんだよね。公式ドキュメントに用法を載せてほしいコードの一つ。
ハイスコアガール(1) (ビッグガンガンコミックススーパー)
- 作者: 押切蓮介
- 出版社/メーカー: スクウェア・エニックス
- 発売日: 2012/02/25
- メディア: コミック
- 購入: 14人 クリック: 277回
- この商品を含むブログ (98件) を見る