2007-06-14
■[Ruby] ランキングの集計
リスト中に登場する回数の多い要素トップ N を計算するとき、どんな風に書きますか?
順序統計量の話がしたいわけではなく、そういうコードは頻繁に書くわりに、書き方に納得できなくていつも悩んでいるのです。短く、かつ、わかりやすい書き方がポイント高いです (効率は軽視) 。普段は以下のように書いているけど、これは長すぎかつ難解で納得できてません。
ary = %w(foo bar foo baz foo bar qux foo bar qux quux) n = 3 # 回数をカウントする count = Hash.new { 0 } ary.each {|x| count[x] += 1 } # (文字列 -> 回数) のハッシュを反転して (回数 -> [文字列]) にする rev_count = {} count.each {|k, v| (rev_count[v] ||= []) << k } i = 1 # 回数の大きい順に回す rev_count.keys.sort.reverse.each do |v| # 順位を数えながら出力する puts "#{ i } 位:" rev_count[v].each {|k| puts "- #{ k }" } i += rev_count[v].size break if i > n end
ここで悩むのは Hash クラスに何かメソッドが足りてないサインではないか (自分中心的な発想) 。
トラックバック - http://d.hatena.ne.jp/ku-ma-me/20070614/p2
リンク元
- 75 http://ja.reddit.com/
- 70 http://www.kmonos.net/wlog/
- 37 http://mono.kmc.gr.jp/~yhara/d/?date=20070612
- 36 http://reader.livedoor.com/reader/
- 31 http://www.kmonos.net/wlog/74.html
- 23 http://shinh.skr.jp/m/
- 21 http://d.hatena.ne.jp/odz/
- 16 http://www.google.com/reader/view/
- 16 http://yowaken.dip.jp/tdiary/20070615.html
- 14 http://www.kmonos.net/a/
