Hashテーブルで単語の出現頻度を数える

Hashテーブルを使ってファイルに含まれる単語の出現頻度を数えてみます。
今まではこんな風に書いていたんですが、

class Hash
  def increment_counter(key)
    self[key] ||= 0
    self[key] += 1
  end
end

table = {} # word => count
ARGF.read.scan(/\w+/).each do |word|
  table.increment_counter(word)
end

RubyではHashのデフォルト値を変更することができるので、次のように書くこともできます。こちらの方が効率的です。

table = Hash.new(0) # word => count
ARGF.read.scan(/\w+/).each do |word|
  table[word] += 1
end

ついでに。こんな感じで出現頻度の高い順にソートして出力できます(うーん、もっと簡単に書けないかな)。こちらは完全なプログラムになっています。

#!/usr/bin/env ruby

table = Hash.new(0) # word => count
ARGF.read.scan(/\w+/).each do |word|
  table[word] += 1
end

rtable = Hash.new {|hash, key| hash[key] = [] } # count => [word...]
table.each do |word, count|
  rtable[count].push word
end

rtable.keys.sort.reverse.each do |count|
  printf "%8d: %s\n", count, rtable[count].join(', ')
end

参照: プログラミング言語 Ruby リファレンスマニュアル プログラミング言語 Ruby リファレンスマニュアル