Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

Hashで複数の条件で整列

RubyでHashの整列は理解できたのですが,例えば,

  1. value で整列
  2. value が同じ値のときは,keyで整列

したいと思ったときに,どうすればいいか調べてみました。
まず,(1)の方法を試したのですが,Rubyの場合,a[1] <=> b[1]が0のときもor以降が実行されないので,却下。次に(2)の方法を考えました。これだと意図した動作をしますが,いろいろと調べたところ(3)の方法をWebで発見しました。

#!/usr/local/bin/ruby
require 'pp'

hash = {
  "sadowara" => "miyazaki",
  "nobeoka" => "miyazaki",
  "miyakonojou" => "miyazaki",
  "miyazaki" => "miyazaki",
  "amakusa" => "kumamoto",
  "hitoyoshi"=> "kumamoto",
  "kumamoto" => "kumamoto",
  "kagoshima" => "kagoshima",
  "sendai" => "kagoshima",
}

# (1)
# pp hash.sort {|a, b|
#   a[1] <=> b[1] or a[0] <=> b[0]
# }

# (2)
# pp hash.sort {|a, b|
#   if (a[1] <=> b[1]) == 0
#     a[0] <=> b[0]
#   else
#     a[1] <=> b[1]
#   end
# }

# (3)
pp hash.sort {|a, b|
  (a[1] <=> b[1]) * 2 + (a[0] <=> b[0])
}

以下を参考にしました。

面白い方法だなぁと思います。